珂氏树求条

P2572 [SCOI2010] 序列操作

AlexandreLea @ 2023-11-08 19:48:55

如下所示

TLE 到 30 分:

#include <bits/stdc++.h>
using namespace std;
const int SIZE=1e5+10;
int n,m,a[SIZE];
struct omg{
    int lf,rt;
    mutable int val;
    omg(int lf,int rt=-1,int val=0):lf(lf),rt(rt),val(val){}
    bool operator<(const omg &rhs)const{
        return lf<rhs.lf;
    }
};
set<omg> wtf;
typedef set<omg>::iterator iter;
iter split(int po){
    iter it=wtf.lower_bound(omg(po));
    if(it!=wtf.end()&&it->lf==po) return it;
    it--;
    int l=it->lf,r=it->rt,v=it->val;
    wtf.erase(it);
    wtf.insert(omg(l,po-1,v));
    return wtf.insert(omg(po,r,v)).first;
}
bool fluh=false;
void flushhh(set<omg> &odt){
    set<omg> ano=odt;
    iter it=ano.begin();
    odt.clear(),odt.insert(*ano.begin());
    for(++it;it!=ano.end();++it){
        if((--odt.end())->val==it->val){
            iter aha=--odt.end();
            odt.erase(aha);
            odt.insert(omg(aha->lf,it->rt,it->val));
        }else odt.insert(*it);
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    int o0=(a[1]==0?1:0),o1=(a[1]==1?1:0);
    for(int i=2;i<=n;i++){
        if(a[i]==0){
            if(o1!=0) wtf.insert(omg(o1,i-1,1)),o0=i,o1=0;
        }else{
            if(o0!=0) wtf.insert(omg(o0,i-1,0)),o1=i,o0=0;
        }
    }
    if(o0!=0) wtf.insert(omg(o0,n,0));
    else wtf.insert(omg(o1,n,1));
    while(m--){
        int o,l,r,qans=0;
        cin>>o>>l>>r,l++,r++;
        iter itr=split(r+1),itl=split(l);
        if(o==0||o==1){
            wtf.erase(itl,itr);
            wtf.insert(omg(l,r,o));
        }else if(o==2) for(iter it=itl;it!=itr;++it) it->val=!it->val;
        else if(o==3){
            for(iter it=itl;it!=itr;++it) qans+=it->val*(it->rt-it->lf+1);
            cout<<qans<<endl;
        }else if(o==4){
            flushhh(wtf);
            itr=split(r+1),itl=split(l);
            for(iter it=itl;it!=itr;++it) qans=max(qans,it->val*(it->rt-it->lf+1));
            cout<<qans<<endl;
        }
    }
    return 0;
}

by Argvchs @ 2023-11-08 19:53:55

@Jasminoides

https://oi.wiki/misc/odt/#%E4%B9%A0%E9%A2%98

「SCOI2010」序列操作(该题目来源已添加 Hack 数据)


by AlexandreLea @ 2023-11-08 19:59:05

@Argvchs /thx,求壶关


by _7Mr @ 2023-11-09 23:03:43

@Jasminoides 我 ODT 也只有 30


by AlexandreLea @ 2023-11-09 23:08:26

@luozhih 求壶关(毕竟同一个错误)


by _fwTransform_ @ 2024-06-25 14:27:31

@Jasminoides 同问,哥们过了吗(壶关了)


by AlexandreLea @ 2024-06-25 21:27:29

@ReturnOrContinue 没有……谢谢


|