POJ 2528 Mayor's posters(线段树)

题目链接

非常无语的一个题,参考的HH大神的代码。离散化写的很神。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 using namespace std;
  5 #define lson l , m ,rt<<1
  6 #define rson m + 1, r, rt<<1|1
  7 
  8 const int maxn = 21111;
  9 int cnt;
 10 bool hash[maxn];
 11 int x[maxn+30],y[maxn+30];
 12 int col[maxn<<4];
 13 int que[3*maxn];
 14 
 15 void pushdown(int rt)
 16 {
 17     if(col[rt] != -1)
 18     {
 19         col[rt<<1] = col[rt<<1|1] = col[rt];
 20         col[rt] = -1;
 21     }
 22 }
 23 void query(int l,int r,int rt)
 24 {
 25     int m;
 26     if(col[rt] != -1)
 27     {
 28         if(!hash[col[rt]])
 29         {
 30             hash[col[rt]] = 1;
 31             cnt ++;
 32         }
 33         return ;
 34     }
 35     if(l == r) return ;
 36     m = (l+r)>>1;
 37     query(lson);
 38     query(rson);
 39 }
 40 void update(int L,int R,int sc,int l,int r,int rt)
 41 {
 42     int m;
 43     if(l >= L&&r <= R)
 44     {
 45         col[rt] = sc;
 46         return ;
 47     }
 48     pushdown(rt);
 49     m = (l+r)>>1;
 50     if(L <= m) update(L,R,sc,lson);
 51     if(R > m) update(L,R,sc,rson);
 52 }
 53 int bin(int key,int n)
 54 {
 55     int str,end,mid;
 56     str = 0;
 57     end = n-1;
 58     while(str <= end)
 59     {
 60         mid = (str+end)/2;
 61         if(que[mid] == key)
 62             return mid;
 63         else if(que[mid] > key)
 64             end = mid-1;
 65         else
 66             str = mid+1;
 67     }
 68     return -1;
 69 }
 70 int main()
 71 {
 72     int T,n,l,r,m;
 73     scanf("%d",&T);
 74     while (T --)
 75     {
 76         scanf("%d",&n);
 77         m = 0;
 78         for (int i = 0 ; i < n ; i ++)
 79         {
 80             scanf("%d%d",&x[i] , &y[i]);
 81             que[m++] = x[i];
 82             que[m++] = y[i];
 83         }
 84         sort(que , que + m);
 85         m = 1;
 86         for (int i = 1 ; i < 2*n; i ++)
 87         {
 88             if (que[i] != que[i-1])
 89             que[m ++] = que[i];
 90         }
 91         for (int i = m - 1 ; i > 0 ; i --)
 92         {
 93             if (que[i] != que[i-1] + 1)
 94             que[m ++] = que[i-1] + 1;
 95         }
 96         sort(que,que + m);
 97         memset(col , -1 , sizeof(col));
 98         for (int i = 0 ; i < n ; i ++)
 99         {
100             l = bin(x[i],m);
101             r = bin(y[i],m);
102             update(l,r,i,0,m,1);
103         }
104         cnt = 0;
105         memset(hash,false,sizeof(hash));
106         query(0,m,1);
107         printf("%d\n",cnt);
108     }
109     return 0;
110 }

 

posted @ 2013-06-04 21:37  Naix_x  阅读(160)  评论(0编辑  收藏  举报