标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 54067 | Accepted: 15713 |
Description
Input
Output
Sample Input
1 5 1 4 2 6 8 10 3 4 7 10
Sample Output
4
题解:跟颜色段那道题很像,但是写了下wa,最后借助bin神的思路才写出来;
ac代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; const int INF=0x3f3f3f3f; #define mem(x,y) memset(x,y,sizeof(x)) #define SI(x) scanf("%d",&x) #define PI(x) printf("%d",x) #define SD(x,y) scanf("%lf%lf",&x,&y) #define P_ printf(" ") #define ll root<<1 #define rr root<<1|1 #define lson ll,l,mid #define rson rr,mid+1,r #define V(x) tree[x] typedef long long LL; const int MAXN=100010; bool tree[MAXN<<2]; int h[10000010],seg[MAXN<<1]; struct Node{ int a,b; Node init(int c,int d){ a=c;b=d; } }; Node dt[MAXN]; void build(int root,int l,int r){ V(root)=false; int mid=(l+r)>>1; if(l==r)return; build(lson);build(rson); } bool query(int root,int l,int r,int A,int B){ int mid=(l+r)>>1; if(V(root))return false;//线段树都是从上倒下访问的,覆盖的线段是true,就返回false bool bcover; if(l==A&&r==B){ V(root)=true; return true; } if(mid>=B)bcover=query(lson,A,B); else if(mid<A)bcover=query(rson,A,B); else{ int b1=query(lson,A,mid);// int b2=query(rson,mid+1,B);// bcover=b1||b2; } if(V(ll)&&V(rr))V(root)=true; return bcover; } int main(){ int T,N; SI(T); while(T--){ SI(N); int a,b; int len=0,val=0; for(int i=0;i<N;i++){ SI(a);SI(b); dt[i].init(a,b); seg[len++]=a;seg[len++]=b; } sort(seg,seg+len); int k=unique(seg,seg+len)-seg; for(int i=0;i<k;i++)h[seg[i]]=i; int ans=0; build(1,0,k-1); for(int i=N-1;i>=0;i--){//从上往下; if(query(1,0,k-1,h[dt[i].a],h[dt[i].b]))ans++; } printf("%d\n",ans); } return 0; }
wa代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; const int INF=0x3f3f3f3f; #define mem(x,y) memset(x,y,sizeof(x)) #define SI(x) scanf("%d",&x) #define PI(x) printf("%d",x) #define SD(x,y) scanf("%lf%lf",&x,&y) #define P_ printf(" ") #define ll root<<1 #define rr root<<1|1 #define lson ll,l,mid #define rson rr,mid+1,r #define V(x) tree[x] typedef long long LL; const int MAXN=20010; int color[MAXN]; int temp; int tree[MAXN<<2]; int seg[MAXN]; struct Node{ int a,b; Node init(int c,int d){ a=c;b=d; } }; Node dt[MAXN]; void pushdown(int root){ if(V(root)>0){ V(ll)=V(root); V(rr)=V(root); V(root)=-1; } } void build(int root,int l,int r){ int mid=(l+r)>>1; V(root)=0; if(l==r)return; build(lson);build(rson); } void update(int root,int l,int r,int A,int B,int v){ if(l>=A&&r<=B){ V(root)=v; return; } int mid=(l+r)>>1; pushdown(root); if(mid>=A)update(lson,A,B,v); if(mid<B)update(rson,A,B,v); V(root)=-1; } void query(int root,int l,int r){ int mid=(l+r)>>1; if(temp==V(root))return; if(!V(root)){ temp=0;return; } if(V(root)!=-1){ if(temp!=V(root)){ temp=V(root); color[temp]++; return; } return; } if(l==r)return; query(lson); query(rson); } int main(){ int T,N; SI(T); while(T--){ mem(color,0); SI(N); int a,b; int len=0; for(int i=0;i<N;i++){ SI(a);SI(b); dt[i].init(a,b); seg[len++]=a;seg[len++]=b; } sort(seg,seg+len); int k=unique(seg,seg+len)-seg; build(1,1,k); for(int i=0;i<N;i++){ a=lower_bound(seg,seg+k,dt[i].a)-seg; b=lower_bound(seg,seg+k,dt[i].b)-seg; update(1,1,k,a+1,b,i+1); } temp=0; query(1,1,k); int ans=0; for(int i=1;i<=N;i++){ if(color[i])ans++; } printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/5202037.html