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 }