RE #5疑似爆空间,求调
  • 板块CF558E A Simple Task
  • 楼主_H17_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/11 21:22
  • 上次更新2024/11/12 10:03:45
查看原帖
RE #5疑似爆空间,求调
743014
_H17_楼主2024/11/11 21:22
#include<bits/stdc++.h>
using namespace std;
constexpr int N=1e5+1;
int n,q,root,tot;
vector<int>ans,tmp1,tmp2,tmp3;
string s;
struct SegmentTreeNode{
    int l,r,ls,rs,tag;
    vector<int>val;
    SegmentTreeNode(int l=0,int r=0):l(l),r(r),ls(0),rs(0),val(vector<int>(26,0)),tag(-1){}
}f[N<<1];
void pushup(int cur){
    for(int i=0;i<26;i++)
        f[cur].val[i]=f[f[cur].ls].val[i]+f[f[cur].rs].val[i];
    return;
}
SegmentTreeNode pushup(const SegmentTreeNode&a,const SegmentTreeNode&b){
    SegmentTreeNode ret(a.l,b.r);
    for(int i=0;i<26;i++)
        ret.val[i]=a.val[i]+b.val[i];
    return ret;
}
void pushdown(int cur){
    if(f[cur].tag!=-1){
        f[f[cur].ls].tag=f[f[cur].rs].tag=f[cur].tag;
        f[f[cur].ls].val=f[f[cur].rs].val=vector<int>(26,0);
        f[f[cur].ls].val[f[cur].tag]=f[f[cur].ls].r-f[f[cur].ls].l+1,
        f[f[cur].rs].val[f[cur].tag]=f[f[cur].rs].r-f[f[cur].rs].l+1;
        f[cur].tag=-1;
    }
    return;
}
void build(int l,int r,int&cur){
    f[cur=(++tot)]=SegmentTreeNode(l,r);
    if(l==r){
        f[cur].val[s[l]-'a']=1;
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,f[cur].ls),build(mid+1,r,f[cur].rs);
    return pushup(cur);
}
void modify(int l,int r,int val,int cur){
    if(l<=f[cur].l&&f[cur].r<=r){
        f[cur].val=vector<int>(26,0);
        f[cur].val[val]=(f[cur].r-f[cur].l+1);
        f[cur].tag=val;
        return;
    }
    pushdown(cur);
    int mid=(f[cur].l+f[cur].r)>>1;
    if(l<=mid)
        modify(l,r,val,f[cur].ls);
    if(mid<r)
        modify(l,r,val,f[cur].rs);
    return pushup(cur);
}
SegmentTreeNode query(int l,int r,int cur){
    if(l<=f[cur].l&&f[cur].r<=r)
        return f[cur];
    pushdown(cur);
    int mid=(f[cur].l+f[cur].r)>>1;
    if(mid<l)
        return query(l,r,f[cur].rs);
    if(r<=mid)
        return query(l,r,f[cur].ls);
    return pushup(query(l,r,f[cur].ls),query(l,r,f[cur].rs));
}
void debug(){
    for(int i=1;i<=n;i++){
        ans=query(i,i,1).val;
        for(int j=0;j<26;j++)
            if(ans[j])
                cerr<<(char)(j+'a');
    }
    cerr<<'\n';
    return;
}
int main(){
    cin>>n>>q>>s;
    s=" "+s;
    build(1,n,root);
//    debug();
    for(int l,r,op;q;--q){
        cin>>l>>r>>op;
        vector<int>vals=query(l,r,1).val;
        if(op) for(int i=0,lst=l;i<26;i++){
            modify(lst,lst+vals[i]-1,i,1);
            lst+=vals[i];
        }
        else for(int i=0,lst=r;i<26;i++){
            modify(lst-vals[i]+1,lst,i,1);
            lst-=vals[i];
        }
//        debug();
    }
    for(int i=1;i<=n;i++){
        ans=query(i,i,1).val;
        for(int j=0;j<26;j++)
            if(ans[j])
                cout<<(char)(j+'a');
    }
    return 0;
}
2024/11/11 21:22
加载中...