萌新求助,线段树 WA+TLE
查看原帖
萌新求助,线段树 WA+TLE
610557
shinzanmonoszm 妹妹楼主2023/7/21 20:38
#include<iostream>
#include<algorithm>
const int sz=1e5+10;
int arr[sz];
struct ST{
    int tree[sz<<2][26],lazy[sz<<2][26];
    void build(int p,int ln,int rn){
        if(ln==rn)return tree[p][arr[ln]]=1,void();
        int mid=ln+rn>>1;
        build(p<<1,ln,mid);
        build(p<<1|1,mid+1,rn);
        for(int i=0;i<26;i++)
            tree[p][i]=tree[p<<1][i]+tree[p<<1|1][i];
    }
    void pushdown(int p,int ln,int rn){
        for(int i=0;i<26;i++){
            if(lazy[p][i]!=0){
                lazy[p<<1][i]=lazy[p<<1|1][i]=lazy[p][i];
                tree[p<<1][lazy[p][i]]+=tree[p<<1][i],tree[p<<1][i]=0;
                tree[p<<1|1][lazy[p][i]]+=tree[p<<1|1][i],tree[p<<1|1][i]=0;
                lazy[p][i]=0;
            }
        }
    }
    void change(int p,int ln,int rn,int l,int r,int x,int y){
        if(ln!=rn)pushdown(p,ln,rn);
        if(ln>=l&&rn<=r)
            return tree[p][y]+=tree[p][x],tree[p][x]=0,lazy[p][x]=y,void();
        int mid=ln+rn>>1;
        if(l<=mid)change(p<<1,ln,mid,l,r,x,y);
        if(r>mid)change(p<<1|1,mid+1,rn,l,r,x,y);
        for(int i=0;i<26;i++)
            tree[p][i]=tree[p<<1][i]+tree[p<<1|1][i];
    }
    void print(int p,int ln,int rn){
        if(ln==rn)
            for(int i=0;i<26;i++)
                if(tree[p][i]!=0)return putchar(i+'a'),void();
        int mid=ln+rn>>1;
        pushdown(p,ln,rn);
        print(p<<1,ln,mid);
        print(p<<1|1,mid+1,rn);
    }
}st;
int main(){
    std::cin.tie(nullptr)->sync_with_stdio(false);
    int n,q;
    std::string s;
    std::cin>>s>>q;
    n=s.length();
    for(int i=1;i<=n;i++)arr[i]=s[i-1]-'a';
    st.build(1,1,n);
    while(q--){
        int l,r;
        char x,y;
        std::cin>>l>>r>>x>>y;
        st.change(1,1,n,l,r,x-'a',y-'a');
    }
    st.print(1,1,n);
    return 0;
}
2023/7/21 20:38
加载中...