• 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;
    }
  • 相关阅读:
    C# 与Sql server 获取数据和执行命令
    关于*.ashx 处理程序调试时 未能创建类型 错误
    winform 利用Http向服务器上传与下载文件
    CSS 使用absolute 是<div>居中
    C# int[,] 和 int[][]
    《Head First JavaScript》 学习笔记
    【单片机】关于头文件
    【单片机】【710】定时器
    【C#】委托
    【C#】关于接口的理解
  • 原文地址:https://www.cnblogs.com/lnxcj/p/9807945.html
Copyright © 2020-2023  润新知