【POJ】2528 Mayor's posters

  1 #include<cstdio>

  2 #include<cstring>

  3 #include<cstdlib>

  4 #define MAXN 50010

  5 struct node

  6 {

  7     int x,y;

  8 };

  9 node a[MAXN],p[MAXN];

 10 int cmp(const void *a,const void *b)

 11 {

 12     return (*(node *)a).x-(*(node *)b).x;

 13 }

 14 int ans,tree[MAXN<<2];

 15 bool vis[MAXN];

 16 inline void PushDown(int rt)

 17 {

 18     if(tree[rt])

 19     {

 20         tree[rt<<1]=tree[rt<<1|1]=tree[rt];

 21         tree[rt]=0;

 22     }

 23 }

 24 void Update(int x,int y,int val,int L,int R,int rt)

 25 {

 26     if(x<=L&&R<=y)

 27         tree[rt]=val;

 28     else

 29     {

 30         int mid=(L+R)>>1;

 31         PushDown(rt);

 32         if(mid>=x)

 33             Update(x,y,val,L,mid,rt<<1);

 34         if(y>mid)

 35             Update(x,y,val,mid+1,R,rt<<1|1);

 36     }

 37 }

 38 void Query(int L,int R,int rt)

 39 {

 40     if(tree[rt])

 41     {

 42         if(!vis[tree[rt]])

 43         {

 44             vis[tree[rt]]=true;

 45             ans++;

 46         }

 47     }

 48     else if(L!=R)

 49     {

 50         int mid=(L+R)>>1;

 51         Query(L,mid,rt<<1);

 52         Query(mid+1,R,rt<<1|1);

 53     }

 54 }

 55 int Bin(int low,int high,int val)

 56 {

 57     int mid;

 58     while(low<high)

 59     {

 60         mid=(high+low)>>1;

 61         if(a[mid].x==val)

 62             return a[mid].y;

 63         if(a[mid].x>val)

 64             high=mid;

 65         else

 66             low=mid+1;

 67     }

 68 }

 69 int main()

 70 {

 71     int c,n,i,j,k;

 72     scanf("%d",&c);

 73     while(c--)

 74     {

 75         scanf("%d",&n);

 76         for(i=k=0;i<n;i++)

 77         {

 78             scanf("%d%d",&p[i].x,&p[i].y);

 79             a[k++].x=p[i].x;

 80             a[k++].x=p[i].y;

 81         }

 82         qsort(a,k,sizeof(a[0]),cmp);

 83         for(i=j=0;i<k;i++)

 84         {

 85             if(a[i].x!=a[j].x)

 86                 a[++j]=a[i];

 87         }

 88         k=j+1;

 89         a[0].y=j=1;

 90         for(i=1;i<k;i++)

 91         {

 92             if(a[i].x==a[i-1].x+1)

 93                 j++;

 94             else

 95                 j+=2;

 96             a[i].y=j;

 97         }

 98         memset(tree,0,sizeof(tree));

 99         memset(vis,false,sizeof(vis));

100         for(i=ans=0;i<n;i++)

101             Update(Bin(0,k,p[i].x),Bin(0,k,p[i].y),i+1,1,j,1);

102         Query(1,j,1);

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

104     }

105     return 0;

106 }

你可能感兴趣的:(post)