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