zoukankan      html  css  js  c++  java
  • codeforces 558E A Simple Task

    拿线段树随便搞搞就好了

    并非原题代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,m,cnt,tot,tmp;
    int cg[8];
    int st[100005];
    struct node{
        int num[8];
        int tag;
    }tr[100000*4+5];
    void pushup(int u){
        for(int i=1;i<=7;i++){
            tr[u].num[i]=tr[u*2].num[i]+tr[u*2+1].num[i];
        }
    }
    void pushdown(int u,int l,int r){
        int mid=(l+r)>>1;
        if(l==r)tr[u].tag=0;
        if(tr[u].tag==1){
            for(int j=1;j<=7;j++){
                tr[u*2].num[j]=tr[u*2+1].num[j]=0;
            }
            int i;
            int num=mid-l+1;
            for(i=1;i<=7;i++){
                if(num<=tr[u].num[i]){
                    tr[u*2].num[i]=num;
                    break;
                }
                else{
                    num-=tr[u].num[i];
                    tr[u*2].num[i]=tr[u].num[i];
                }
            }
            for(i;i<=7;i++){
                if(num){
                    tr[u*2+1].num[i]=tr[u].num[i]-num;
                    num=0;
                }else{
                    tr[u*2+1].num[i]=tr[u].num[i];
                }
            }
        }
        if(tr[u].tag==2){
            for(int j=1;j<=7;j++){
                tr[u*2].num[j]=tr[u*2+1].num[j]=0;
            }
            int i;
            int num=r-mid;
            for(i=1;i<=7;i++){
                if(num<=tr[u].num[i]){
                    tr[u*2+1].num[i]=num;
                    break;
                }else{
                    num-=tr[u].num[i];
                    tr[u*2+1].num[i]=tr[u].num[i];
                }
            }
            for(i;i<=7;i++){
                if(num){
                    tr[u*2].num[i]=tr[u].num[i]-num;
                    num=0;
                }else{
                    tr[u*2].num[i]=tr[u].num[i];
                }
            }
        }
        if(tr[u].tag)tr[u*2].tag=tr[u*2+1].tag=tr[u].tag;
        tr[u].tag=0;
    }
    void build(int u,int l,int r){
        if(l==r){
            tr[u].num[st[l]]++;
            return;
        }
        int mid=(l+r)>>1;
        build(u*2,l,mid);
        build(u*2+1,mid+1,r);
        pushup(u);
    }
    void pre_add(int u,int l,int r,int ql,int qr){
        if(ql>r||qr<l){
            return;
        }
        int mid=(l+r)>>1;
        if(ql<=l&&qr>=r){
            for(int i=1;i<=7;i++){
                cg[i]+=tr[u].num[i];
            }
            return;
        }
        pushdown(u,l,r);
        pre_add(u*2,l,mid,ql,qr);
        pre_add(u*2+1,mid+1,r,ql,qr);
    }
    void change(int u,int l,int r,int ql,int qr,int v){
        if(ql>r||qr<l){
            return;
        }
        int mid=(l+r)>>1;
        if(ql<=l&&qr>=r){
            tr[u].tag=v;
            if(v==1){
                for(int i=1;i<=7;i++){
                    tr[u].num[i]=0;
                }
                int cn=r-l+1;
                for(int i=1;i<=7;i++){
                    if(cn<=cg[i]){
                        tr[u].num[i]=cn;
                        cg[i]-=cn;
                        cn=0;
                    }
                    else{
                        tr[u].num[i]=cg[i];
                        cn-=cg[i];
                        cg[i]=0;
                    }
                }
            }
            if(v==2){
                for(int i=1;i<=7;i++){
                    tr[u].num[i]=0;
                }
                int cn=r-l+1;
                for(int i=7;i>=1;i--){
                    if(cn<=cg[i]){
                        tr[u].num[i]=cn;
                        cg[i]-=cn;
                        cn=0;
                    }
                    else{
                        tr[u].num[i]=cg[i];
                        cn-=cg[i];
                        cg[i]=0;
                    }
                }
            }
            pushdown(u,l,r);
            return;
        }
        pushdown(u,l,r);
        change(u*2,l,mid,ql,qr,v);
        change(u*2+1,mid+1,r,ql,qr,v);
        pushup(u);
    }
    void query(int u,int l,int r){
        pushdown(u,l,r);
        if(l==r){
            for(int i=1;i<=7;i++){
                if(tr[u].num[i])printf("%d ",i);
            }
            return;
        }
        int mid=(l+r)>>1;
        query(u*2,l,mid);
        query(u*2+1,mid+1,r);
    }
    int main(){
        //freopen("third.in","r",stdin);
        //freopen("third.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%d",&st[i]);
        }
        build(1,1,n);
        for(int i=1;i<=m;i++){
            int l,r,v;
            scanf("%d%d%d",&l,&r,&v);
            pre_add(1,1,n,l,r);
            change(1,1,n,l,r,v+1);
        }
        query(1,1,n);
        printf("
    ");
        return 0;
    }
  • 相关阅读:
    VMware 虚拟机扩容磁盘
    记录一次Jenkins多分支构建问题
    ceph 集群快速部署
    阿里云EMAS发布套餐订阅云服务
    我研究过的OA产品这是简单的总结
    Hello,OA!Hello,工作流!寻找OA和工作流的旅途记录
    疑难杂症1-去掉网站里的特殊编码&#65279
    IIS 平台NET无后缀名伪静态实现办法
    让人无语的面试题!!排序!你试试?
    优秀的大企业报告辅助撰写系统介绍
  • 原文地址:https://www.cnblogs.com/lnxcj/p/9807945.html
Copyright © 2011-2022 走看看