poj 2528 Mayor's posters 线段树区间更新

Mayor's posters

Time Limit: 1 Sec  Memory Limit: 256 MB

题目连接

http://poj.org/problem?id=2528

Description

The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city council has finally decided to build an electoral wall for placing the posters and introduce the following rules:
  • Every candidate can place exactly one poster on the wall.
  • All posters are of the same height equal to the height of the wall; the width of a poster can be any integer number of bytes (byte is the unit of length in Bytetown).
  • The wall is divided into segments and the width of each segment is one byte.
  • Each poster must completely cover a contiguous number of wall segments.

They have built a wall 10000000 bytes long (such that there is enough place for all candidates). When the electoral campaign was restarted, the candidates were placing their posters on the wall and their posters differed widely in width. Moreover, the candidates started placing their posters on wall segments already occupied by other posters. Everyone in Bytetown was curious whose posters will be visible (entirely or in part) on the last day before elections.
Your task is to find the number of visible posters when all the posters are placed given the information about posters' size, their place and order of placement on the electoral wall.

Input

There will be several test cases in the input. Each test case consists of N + 1 lines where N (1 ≤ N ≤ 200,000) is given in the first line of the test case. The next N lines contain the pairs of values Posi and Vali in the increasing order of i (1 ≤ iN). For each i, the ranges and meanings of Posi and Vali are as follows:

  • Posi ∈ [0, i − 1] — The i-th person came to the queue and stood right behind the Posi-th person in the queue. The booking office was considered the 0th person and the person at the front of the queue was considered the first person in the queue.
  • Vali ∈ [0, 32767] — The i-th person was assigned the value Vali.

There no blank lines between test cases. Proceed to the end of input.

 

Output

For each input data set print the number of visible posters after all the posters are placed.

The picture below illustrates the case of the sample input.
poj 2528 Mayor's posters 线段树区间更新
 

Sample Input

1
5
1 4
2 6
8 10
3 4
7 10

Sample Output

4

HINT

 

题意

  一个区间贴海报,然后问你在最后,能看见多少个海报

题解:

就单纯的区间更新呀,然后跑一发线段树就好

需要离线做

代码:

 

//qscqesze

#include <cstdio>

#include <cmath>

#include <cstring>

#include <ctime>

#include <iostream>

#include <algorithm>

#include <set>

#include <vector>

#include <sstream>

#include <queue>

#include <typeinfo>

#include <fstream>

#include <map>

#include <stack>

typedef long long ll;

using namespace std;

//freopen("D.in","r",stdin);

//freopen("D.out","w",stdout);

#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)

#define maxn 200001

#define mod 10007

#define eps 1e-9

int Num;

char CH[20];

//const int inf=0x7fffffff;   //нчоч╢С

const int inf=0x3f3f3f3f;

/*



inline void P(int x)

{

    Num=0;if(!x){putchar('0');puts("");return;}

    while(x>0)CH[++Num]=x%10,x/=10;

    while(Num)putchar(CH[Num--]+48);

    puts("");

}

*/

//**************************************************************************************

inline ll read()

{

    int x=0,f=1;char ch=getchar();

    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}

    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}

    return x*f;

}

inline void P(int x)

{

    Num=0;if(!x){putchar('0');puts("");return;}

    while(x>0)CH[++Num]=x%10,x/=10;

    while(Num)putchar(CH[Num--]+48);

    puts("");

}

vector<int> p;

map<int,int>H;

struct node

{

    int l,r,v;

};

node a[maxn*4];

struct qu

{

    int x,y;

}q[maxn];

int flag[maxn];

void build(int x,int l,int r)

{

    a[x].l=l,a[x].r=r;

    a[x].v=0;

    if(l==r)

        return;

    int mid=(l+r)>>1;

    build(x<<1,l,mid);

    build(x<<1|1,mid+1,r);

}

void relax(int x)

{

    if(a[x].v)

    {

        a[x<<1].v=a[x].v;

        a[x<<1|1].v=a[x].v;

        a[x].v=0;

    }

}

void update(int st,int ed,int x,int val)

{

    int l=a[x].l,r=a[x].r;

    if(st<=l&&r<=ed)

        a[x].v=val;

    else

    {

        relax(x);

        int mid=(l+r)>>1;

        if(st<=mid)update(st,ed,x<<1,val);

        if(ed>mid)update(st,ed,x<<1|1,val);

    }

}

void query(int x,int st,int ed)

{

    int l=a[x].l,r=a[x].r;

    if(a[x].v!=0||l==r)

    {

        flag[a[x].v]=1;

        return;

    }

    query(x<<1,st,ed);

    query(x<<1|1,st,ed);

}

int main()

{

    int t=read();

    while(t--)

    {

        H.clear(),p.clear();

        int n=read();

        for(int i=0;i<n;i++)

        {

            q[i].x=read(),q[i].y=read();

            p.push_back(q[i].x);

            p.push_back(q[i].y);

        }

        for(int i=1;i<=n;i++)

            flag[i]=0;

        sort(p.begin(),p.end());

        p.erase(unique(p.begin(),p.end()),p.end());

        for(int i=0;i<p.size();i++)

            H[p[i]]=i+1;

        build(1,1,p.size());

        for(int i=0;i<n;i++)

            update(H[q[i].x],H[q[i].y],1,i+1);

        query(1,1,p.size());

        int ans=0;

        for(int i=1;i<=n;i++)

            if(flag[i])

                ans++;

        printf("%d\n",ans);

    }

}

 

你可能感兴趣的:(post)