【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;
}
原文地址:https://www.cnblogs.com/illya/p/7647169.html