#include<iostream>
#include<stdio.h>
using namespace std;
#define MAX 40002
int a[MAX],b[MAX],flag[MAX],stl[MAX*250];
struct node{
int l,r,c;
};
struct node tree[MAX*4];
#define Mid(idx) (tree[idx].l+tree[idx].r)/2
void buildTree(int idx,int l,int r){
tree[idx].l=l;
tree[idx].r=r;
tree[idx].c=0;
if(r!=l){
int mid=(l+r)>>1;
buildTree(idx<<1,l,mid);
buildTree(idx<<1|1,mid+1,r);
}
return ;
}
void Insert(int idx,int l,int r,int c){
// if(tree[idx].c==c) return ;
if(tree[idx].l==l&&tree[idx].r==r) {
tree[idx].c=c;return ;
}
if(tree[idx].c>0){
tree[idx<<1].c=tree[idx<<1|1].c=tree[idx].c;
tree[idx].c=0;
}
int mid=Mid(idx);
if(mid>=r) Insert(idx<<1,l,r,c);
else if(l>mid) Insert(idx<<1|1,l,r,c);
else {
Insert(idx<<1,l,mid,c);
Insert(idx<<1|1,mid+1,r,c);
}
}
int querySum(int idx){
int count=0;
if (tree[idx].c>0){
if(!flag[tree[idx].c]){
flag[tree[idx].c]=1;
count=1;
}
return count;
}
return count=querySum(idx<<1)+querySum(idx<<1|1);
}
int main(){
int T,n,i,j,k,t,l,r,tmp[MAX*2];
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(flag,0,sizeof(flag));
for(i=1,j=n+1;i<=n;j++,i++){
scanf("%d%d",&a[i],&b[i]);
tmp[i]=a[i];tmp[j]=b[i];
}
sort(tmp+1,tmp+2*n+1);
t=1;stl[tmp[1]]=t;k=2*n;
for(i=2; i<=k; i++){
if(tmp[i]!=tmp[i-1]) stl[tmp[i]]=++t;
}
buildTree(1,1,t);
for(i=1;i<=n;i++){
Insert(1,stl[a[i]],stl[b[i]],i);
}
cout<<querySum(1)<<endl;
}
return 0;
}
poj 2528 Mayor's posters

最新推荐文章于 2023-06-21 14:19:30 发布
