珂朵莉树求调(玄关)(subtask#1已过)

P2572 [SCOI2010] 序列操作

OIer_hjh @ 2024-08-17 19:33:37

hack 数据 AC 了,不知道为啥 RE QAQ

评测记录

(个人感觉码风还好

#include<iostream>
#include<set>
using namespace std;
const int N=1e5+5;
int n,q;
int a[N];

inline int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-'){
            f=-1;
        }
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<3)+(x<<1)+(c-'0');
        c=getchar();
    }
    return x*f;
}

struct node{
    int l,r;
    mutable int v;
    bool operator<(const node &o)const{
        return l<o.l;
    }
};

set<node> t;

auto split(int m){
    if(m>n){
        return t.end();
    }
    auto it=t.upper_bound({m,0,0});
    it--;
    if(it->l==m){
        return it;
    }
    int l=it->l,r=it->r,v=it->v;
    t.erase(it);
    t.insert({l,m-1,v});
    return t.insert({m,r,v}).first;
}

void Merge(){
    for(auto it=t.begin();it!=t.end();it++){
        int l=it->l,r,v=it->v;
        auto itl=it;
        while(it->v==v){
            it++;
        }
        auto itr=it;
        it--;
        r=it->r;
//      cout<<l<<' '<<r<<' '<<v<<endl;
        t.erase(itl,itr);
        t.insert({l,r,v});
    }
}

void assign(int l,int r,int v){
    auto itr=split(r+1),itl=split(l);
    t.erase(itl,itr);
    t.insert({l,r,v});
}

void change(int l,int r){
    auto itr=split(r+1),itl=split(l);
    for(;itl!=itr;itl++){
//      cout<<itl->l<<' '<<itl->r<<' '<<itl->v<<endl;
        itl->v=itl->v^1;
    }
}

int ask_cnt(int l,int r){
    auto itr=split(r+1),itl=split(l);
    int cnt=0;
    for(;itl!=itr;itl++){
//      cout<<itl->l<<' '<<itl->r<<' '<<itl->v<<endl;
        if(itl->v){
            cnt+=itl->r-itl->l+1;
        }
    }
    return cnt;
}

int ask_max(int l,int r){
    auto itr=split(r+1),itl=split(l);
    int res=0;
    for(;itl!=itr;itl++){
//      cout<<itl->l<<' '<<itl->r<<' '<<itl->v<<endl;
        if(itl->v){
            res=max(res,itl->r-itl->l+1);
        }
    }
    return res;
}

int main(){
    n=read();
    q=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
    }
    for(int i=1;i<=n;i++){
        int j=i;
        while(a[j+1]==a[i]&&j<=n){
            j++;
        }
        t.insert({i,j,a[i]});
//      cout<<i<<' '<<j<<' '<<a[i]<<endl;
        i=j;
    }
    while(q--){
        int op=read(),l=read(),r=read();
        l++;
        r++;
        if(op<=1){
            assign(l,r,op);
        }
        if(op==2){
            change(l,r);
        }
        if(op==3){
            cout<<ask_cnt(l,r)<<endl;
        }
        if(op==4){
            cout<<ask_max(l,r)<<endl;
        }
        Merge();
    }
    return 0;
}

by time_keeper @ 2024-08-17 19:41:30

这题珂朵莉树卡不过的

珂朵莉树似乎只有在随机数据下才能跑


by time_keeper @ 2024-08-17 19:42:30

至少我不会

见这


by OIer_hjh @ 2024-08-18 13:06:36

@yonghu_3913 感谢


|