ezoiHQM @ 2017-12-27 19:28:50
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int T,n,ans,cnt,tot,Segment_tree[100010],lazy_tag[100010],Left[10010],Right[10010];
bool _t[10000010];
struct node{
bool ck;
int color,x;
bool operator<(const node&a)const{
return x<a.x;
}
}_p[20010];
void pushdown(int o){
if(lazy_tag[o]){
lazy_tag[o<<1]=Segment_tree[o<<1]=lazy_tag[o<<1|1]=Segment_tree[o<<1|1]=lazy_tag[o];
lazy_tag[o]=0;
}
}
void updata(int o,int l,int r,int L,int R,int x){
if(L<=l&&r<=R){
lazy_tag[o]=x;
Segment_tree[o]=x;
return;
}
pushdown(o);
int mid=(l+r)>>1;
if(L<=mid)
updata(o<<1,l,mid,L,R,x);
if(R>mid)
updata(o<<1|1,mid+1,r,L,R,x);
Segment_tree[o]=0;
}
void query(int o,int l,int r){
if(Segment_tree[o]){
_t[Segment_tree[o]]=1;
return;
}
pushdown(o);
int mid=(l+r)>>1;
query(o<<1,l,mid);
query(o<<1|1,mid+1,r);
}
int main(){
scanf("%d",&T);
while(T--){
memset(Segment_tree,0,sizeof(Segment_tree));
memset(_t,0,sizeof(_t));
memset(lazy_tag,0,sizeof(lazy_tag));
tot=cnt=ans=0;
scanf("%*d%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&_p[++cnt].x);
scanf("%d",&_p[++cnt].x);
_p[cnt-1].color=_p[cnt].color=i;
_p[cnt-1].ck=0;
_p[cnt].ck=1;
}
sort(_p+1,_p+cnt+1);
_p[1].ck?Right[_p[1].color]=++tot:Left[_p[1].color]=++tot;
for(int i=2;i<=cnt;i++){
if(_p[i].x!=_p[i-1].x)
++tot;
_p[i].ck?Right[_p[i].color]=tot:Left[_p[i].color]=tot;
}
for(int i=1;i<=n;i++)
updata(1,1,tot,Left[i],Right[i],i);
query(1,1,tot);
for(int i=1;i<=n;i++)
if(_t[i])
++ans;
printf("%d\n",ans);
}
return 0;
}
by Zechariah @ 2019-07-09 21:34:47
@BigYellowDog 中间的部分没有了,比如[1,4]和[7,10]覆盖在[1,10]上面的话,查的时候离散化的数组里面只有1 4 7 10,中间[5,6]还有别的海报就没有了,所以把r+1也加到离散化的数组里,这样的话加入[1,4]的时候会把5加进去,就不会导致4后面还有海报而查不到的情况