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 }

 

你可能感兴趣的:(post)