这道题的离散化很巧妙,参考了胡浩大神的代码。自己先理解下
http://www.notonlysuccess.com/ 大神的博客
/*Accepted 1120K 79MS C++ 2109B 2012-07-24 17:40:47*/ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 const int MAXN = 11111; int li[MAXN], ri[MAXN]; int col[MAXN << 4]; int X[MAXN << 2]; int cnt; bool hash[MAXN]; void PushDown( int rt) { if( col[rt] != -1) { col[rt << 1] = col[rt << 1 | 1] = col[rt]; col[rt] = -1; } } void update( int L, int R, int c, int l, int r, int rt) { int m = (l + r) >> 1; if( L <= l && r <= R) { col[rt] = c; return; } PushDown(rt); if( L <= m) update( L, R, c, lson); if( R > m) update( L, R, c, rson); } void query( int l, int r, int rt) { if( col[rt] != -1){ if( !hash[col[rt]]) cnt ++; hash[col[rt]] = true; return; } if( l == r) return; int m = (l + r) >> 1; query(lson); query(rson); } int BS( int key, int n, int X[]) { int l = 0, r = n - 1; while( l <= r) { int m = (l + r) >> 1; if( key == X[m]) return m; if( X[m] < key) l = m + 1; else r = m - 1; } return -1; } int main() { int T; int n, nn, m; scanf( "%d", &T); while( T --){ cnt = 0; scanf( "%d", &n); nn = 0; for( int i = 0; i < n; i ++) { scanf( "%d%d", &li[i], &ri[i]); X[nn ++] = li[i]; X[nn ++] = ri[i]; } sort( X, X + nn); int m = 1; for( int i = 1; i < nn; i ++) if( X[i] != X[i - 1]) X[m ++] = X[i]; for( int i = m - 1; i > 0; i --) if( X[i] != X[i - 1] + 1) X[m ++] = X[i - 1] + 1; sort(X, X + m); memset( col, -1, sizeof col); memset( hash, false, sizeof hash); for( int i = 0; i < n; i ++) { int l = BS( li[i], m, X); int r = BS( ri[i], m, X); update( l, r, i, 0, m, 1); } query( 0, m, 1); printf( "%d\n", cnt); } return 0; }