【bzoj4534】基础排序算法练习题
练习基础排序(笑
鏼爷论文题,写法看论文。
s.lower_bound(l)比lower_bound(s.begin(),s.end(),l)快了不知道多少。。。。改完还是擦着时限过的。
#include<bits/stdc++.h> #define maxn 1505 using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } set<int>s; int n,m,Q; int a[maxn],b[maxn],c[maxn]; struct node{ int x,id; }h[maxn]; bool cmp(node A,node B){ if(A.x==B.x)return A.id<B.id; return A.x<B.x; } void downsort(int l,int r){ if(s.empty())return; set<int>::iterator it=s.lower_bound(l); while(l<=*it&&*it<r){ int x=*it;s.erase(x); swap(a[x],a[x+1]); if(x>1){ if(a[x-1]<a[x]){if(!s.count(x-1))s.insert(x-1);} else{if(s.count(x-1))s.erase(x-1);} } if(x+1<n){ if(a[x+1]<a[x+2]){if(!s.count(x+1))s.insert(x+1);} else{if(s.count(x+1))s.erase(x+1);} } if(s.empty())break; it=s.lower_bound(l); } } struct Segment_Tree{ int l,r,minv,addv; }Tree[maxn<<2]; void pushup(int o){ Tree[o].minv=min(Tree[o<<1].minv,Tree[o<<1|1].minv); } void build(int o,int l,int r){ Tree[o].l=l;Tree[o].r=r;Tree[o].addv=0;Tree[o].minv=0; if(l==r){ Tree[o].minv=0; return; } int mid=l+r>>1; build(o<<1,l,mid); build(o<<1|1,mid+1,r); pushup(o); } void pushdown(int o){ if(Tree[o].addv){ Tree[o<<1].addv+=Tree[o].addv;Tree[o<<1|1].addv+=Tree[o].addv; Tree[o<<1].minv+=Tree[o].addv;Tree[o<<1|1].minv+=Tree[o].addv; Tree[o].addv=0; } } void update(int o,int x,int y,int v){ int l=Tree[o].l,r=Tree[o].r; if(x<=l&&r<=y){ Tree[o].addv+=v; Tree[o].minv+=v; return; } int mid=l+r>>1; pushdown(o); if(x<=mid)update(o<<1,x,y,v); if(y>mid)update(o<<1|1,x,y,v); pushup(o); } struct ques{ int f1,f2; }q[1000005]; int main(){ n=read();m=read();Q=read(); for(int i=1;i<=n;++i)a[i]=i; for(int i=1;i<n;++i)s.insert(i); int f1,f2; for(int i=1;i<=m;++i){ q[i].f1=read();q[i].f2=read(); } for(int i=m;i;--i)downsort(q[i].f1,q[i].f2); for(int i=1;i<=n;++i)c[a[i]]=i; for(int i=1;i<=Q;++i){ for(int j=1;j<=n;++j)h[j].x=read(),h[j].id=j; sort(h+1,h+n+1,cmp); for(int j=1;j<=n;++j)b[j]=h[j].id; build(1,1,n);int flag=1; for(int k=n;k>=2;--k){ update(1,b[k],n,-1); update(1,c[k],n,1); if(Tree[1].minv<0){ flag=0;break; } } if(flag)puts("AC");else puts("WA"); } return 0; }