poj 2528 线段树 离散化()

来源:互联网 发布:郫都区人民政府 知乎 编辑:程序博客网 时间:2024/06/09 22:02
#include<cstdio>#include<cstring>#include<algorithm>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define MAX_N 20001using namespace std;int L[MAX_N],R[MAX_N],d[MAX_N<<3],t[MAX_N<<3];int ans; int flag;void update1(int a,int b,int l,int r,int rt){if(a>r||b<l)return ;if(a<=l&&r<=b){if(t[rt])flag=1;t[rt]=0;return ; }if(t[rt]==0){t[rt<<1]=t[rt<<1|1]=0;}int m=(l+r)>>1;update1(a,b,lson);update1(a,b,rson);if(t[rt<<1]||t[rt<<1|1])t[rt]=1;elset[rt]=0;} int main(){int T,n,tot,cnt;scanf("%d",&T);while(T--){ans=0;scanf("%d",&n);tot=0;for(int i=0;i<MAX_N<<3;i++)t[i]=1;for(int i=0;i<n;i++){scanf("%d%d",&L[i],&R[i]);d[tot++]=L[i];d[tot++]=R[i];}sort(d,d+tot);cnt=1;for(int i=1;i<tot;i++){if(d[i]!=d[i-1])d[cnt++]=d[i];}int tem=cnt;for(int i=1;i<tem;i++){if(d[i]-d[i-1]>1)d[cnt++]=d[i-1]+1;}sort(d,d+cnt);for(int i=n-1;i>=0;i--){int l=lower_bound(d,d+cnt,L[i])-d;int r=lower_bound(d,d+cnt,R[i])-d;flag=0;update1(l,r,0,cnt-1,1);if(flag)ans++;}printf("%d\n",ans);}}

0 0
原创粉丝点击