• 【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;
    }
  • 相关阅读:
    find命令之xargs
    find命令之exec
    find 命令概览
    mv命令
    locate 命令
    whereis 命令
    linux which 查看可执行文件的位置
    Linux应用总结:自动删除n天前日志
    Visual Studio
    Visual Studio- “无法启动此程序,因为计算机中丢失 xxx.dll尝试重新安装该程序以解决此问题"
  • 原文地址:https://www.cnblogs.com/illya/p/7647169.html
Copyright © 2020-2023  润新知