因为规模比较大,离散化+线段树。
题目:http://poj.org/problem?id=2528
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
typedef long long ll;
const int maxn = 20005;
int poster[maxn];
int lo[maxn>>1],ro[maxn>>1];
int flag[maxn<<2];
int hash[maxn];
int ans;
void PushDown(int rt){
if(flag[rt] != -1){
flag[rt<<1] = flag[rt<<1|1] = flag[rt];
flag[rt] = -1;
}
}
void update(int L,int R,int p,int l,int r,int rt){
if(L <= l && r <= R){
flag[rt] = p;
return;
}
PushDown(rt);
int m = (l+r)>>1;
if(L <= m)
update(L, R, p, lson);
if(R > m)
update(L, R, p, rson);
}
void query(int l,int r,int rt){
if(flag[rt] != -1){
if(!hash[flag[rt]])
ans++;
hash[flag[rt]] = 1;
return;
}
if(l == r)
return;
int m = (l + r)>>1;
query(lson);
query(rson);
}
int getlr(int x,int n){
int l = 0,r = n;
while(l <= r){
int m = (l+r)>>1;
if(poster[m] == x)
return m;
else if(x < poster[m])
r = m - 1;
else
l = m + 1;
}
return -1;
}
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int h = 0;
for(int i = 0;i < n;i++){
scanf("%d%d",&lo[i],&ro[i]);
poster[h++] = lo[i];
poster[h++] = ro[i];
}
sort(poster,poster+h);
int m = 1;
for(int i = 1;i < h;i++)
if(poster[i] != poster[i-1])
poster[m++] = poster[i];
// for(int i = 0;i < m;i++)
// printf("%d ",poster[i]);
memset(flag, -1, sizeof(flag));//建树的初始化
for(int i = 0;i < n;i++){
int l = getlr(lo[i],m);
int r = getlr(ro[i],m);
//printf("%d %d\n",l,r);
update(l, r, i, 0, m, 1);
}
ans = 0;
memset(hash, 0, sizeof(hash));
query(0,m,1);
printf("%d\n",ans);
}
return 0;
}