线段树21pts求助qwq
查看原帖
线段树21pts求助qwq
635570
baka24楼主2024/2/27 19:56
#include<bits/stdc++.h>
using namespace std;
#define lson pos<<1
#define rson pos<<1|1
const int MAXN=50010;
inline int read(){char _c=getchar();int _x=0;short _s=1;while(_c<'0'||_c>'9'){if(_c=='-')_s=-1;_c=getchar();}while(_c>='0'&&_c<='9'){_x=_x*10+_c-'0';_c=getchar();}return _x*_s;}

int n,m;char a[MAXN];

struct TREE{int x,lz,siz;}t[N][MAXN<<2];
void pushup(int id,int pos){t[id][pos].x=t[id][lson].x+t[id][rson].x;}
void pushdown(int id,int pos){
    if(~t[id][pos].lz){
        t[id][lson].x=t[id][pos].lz*t[id][lson].siz,t[id][lson].lz=t[id][pos].lz;
        t[id][rson].x=t[id][pos].lz*t[id][rson].siz,t[id][rson].lz=t[id][pos].lz;
        t[id][pos].lz=-1;
    }
}
void build(int pos,int l,int r){
    for(int i=0;i<26;i++){
        t[i][pos].siz=r-l+1;t[i][pos].lz=-1;
    }
    if(l==r){
        t[a[l]%32-1][pos].x++;
        return;
    }
    int mid=(l+r)>>1;
    build(lson,l,mid);
    build(rson,mid+1,r);
    for(int i=0;i<26;i++){
        pushup(i,pos);
    }
}
void update(int id,int pos,int l,int r,int ql,int qr,int x){
    pushdown(id,pos);
    if(ql<=l&&qr>=r){
        t[id][pos].x=x*t[id][pos].siz;
        t[id][pos].lz=x;
        return;
    }
    int mid=(l+r)>>1;
    if(ql<=mid)update(id,lson,l,mid,ql,qr,x);
    if(qr>mid)update(id,rson,mid+1,r,ql,qr,x);
    pushup(id,pos);
}
int query(int id,int pos,int l,int r,int ql,int qr){
    pushdown(id,pos);
    if(ql<=l&&qr>=r){
        return t[id][pos].x;
    }
    int mid=(l+r)>>1,rt=0;
    if(ql<=mid)rt=query(id,lson,l,mid,ql,qr);
    if(qr>mid)rt+=query(id,rson,mid+1,r,ql,qr);
    pushup(id,pos);
    return rt;
}
int cnt[N];
void slv(){
    scanf("%d%d",&n,&m);
    scanf("%s",a+1);build(1,1,n);
    for(int i=1;i<=m;i++){
        int opt,l,r;char k;
        scanf("%d%d%d",&opt,&l,&r);
        if(opt==1){
            k=getchar();
            while(!((k<='Z'&&k>='A')||(k<='z'&&k>='a')))k=getchar();
            printf("%d\n",query(k%32-1,1,1,n,l,r));
        }
        if(opt==2){
            k=getchar();
            while(!((k<='Z'&&k>='A')||(k<='z'&&k>='a')))k=getchar();
            for(int i=0;i<26;i++){
                update(i,1,1,n,l,r,0);
            }
            update(k%32-1,1,1,n,l,r,1);
        }
        if(opt==3){
            for(int i=0;i<26;i++){
                cnt[i]=query(i,1,1,n,l,r);
                update(i,1,1,n,l,r,0);
            }
            int lst=l;
            for(int i=0;i<26;i++){
                if(cnt[i])update(i,1,1,n,lst,lst+cnt[i]-1,1);
                lst+=cnt[i];
            }
        }
    }
}
signed main(){
    slv();
    return 0;
}

拍不出小数据,但大数据随便 Hank,求调 (*/ω\*) 。

2024/2/27 19:56
加载中...