标签:
Description
Input
Output
Sample Input
1 5 1 4 2 6 8 10 3 4 7 10
Sample Output
4
Source
#include<iostream> #include<cstdio> #include<cmath> #include<string> #include<queue> #include<algorithm> #include<stack> #include<cstring> #include<vector> #include<list> #include<set> #include<map> using namespace std; #define ll long long #define mod 1000000007 #define pi (4*atan(1.0)) const int N=1e5+10,M=1e6+10,inf=1e9+10; int sum[N*4],lazy[N*4]; set<int>s; set<int>::iterator it; void pushdown(int pos,int len) { int lson=pos*2; int rson=pos*2+1; if(lazy[pos]) { lazy[lson]=lazy[pos]; lazy[rson]=lazy[pos]; sum[lson]=lazy[pos]; sum[rson]=lazy[pos]; lazy[pos]=0; } } void buildtree(int l,int r,int pos) { lazy[pos]=0; sum[pos]=0; int mid=(l+r)>>1; if(l==r) return; buildtree(l,mid,pos*2); buildtree(mid+1,r,pos*2+1); } void query(int l,int r,int pos) { pushdown(pos,r-l+1); if(l==r) { if(sum[pos]) s.insert(sum[pos]); return; } int mid=(l+r)>>1; query(l,mid,pos*2); query(mid+1,r,pos*2+1); } void update(int L,int R,int c,int l,int r,int pos) { if(L<=l&&r<=R) { lazy[pos]=c; sum[pos]=c; return; } pushdown(pos,(r-l+1)); ll mid=(l+r)>>1; if(L<=mid)update(L,R,c,l,mid,pos*2); if(mid<R)update(L,R,c,mid+1,r,pos*2+1); } struct is { int l,r; }a[N<<2]; int num[N<<2]; int main() { int x,y,z,i,t; int T; scanf("%d",&T); while(T--) { buildtree(1,50000,1); s.clear(); int ji=0; scanf("%d",&x); for(i=0;i<x;i++) { scanf("%d%d",&a[i].l,&a[i].r); num[ji++]=a[i].l; num[ji++]=a[i].r; } sort(num,num+ji); ji=1; for(i=1;i<2*x;i++) if(num[i]!=num[ji-1]) num[ji++]=num[i]; for(i=0;i<x;i++) { int l=lower_bound(num,num+ji,a[i].l)-num; int r=lower_bound(num,num+ji,a[i].r)-num; update(l+1,r+1,i+1,1,50000,1); } query(1,50000,1); printf("%d\n",s.size()); } return 0; }
标签:
原文地址:http://www.cnblogs.com/jhz033/p/5631220.html