珂朵莉树0pts求助(一大半RE)
查看原帖
珂朵莉树0pts求助(一大半RE)
285617
黑影洞人楼主2022/7/29 19:20
#include<cstdio>
#include<algorithm>
#include<set>
#include<iostream>
#define Chtholly_tree ct
#define Chtholly set<Chtholly_tree>::iterator
#define int long long
using namespace std;
struct Chtholly_tree{
	int l,r;
	mutable int val;
	ct(int a=-1,int b=-1,int c=0){l=a,r=b,val=c;}
	bool operator <(const Chtholly_tree &c)const{return l<c.l;}
};
int n,m;
char s[114514];
set<Chtholly_tree>st;
Chtholly split(int p){
	Chtholly it=st.lower_bound(ct(p,0,0));
	if(it!=st.end()&&it->l==p)return it;
	it--;ct tmp=*it;st.erase(it);
	st.insert(ct(tmp.l,p-1,tmp.val));
	return st.insert(ct(p,tmp.r,tmp.val)).first;
}
void assign(int l,int r,int val){
	Chtholly right=split(r+1),left=split(l);
	st.erase(left,right);
	st.insert({l,r,val});
}
int query(int l,int r,int k){
	Chtholly right=split(r+1),left=split(l);
	int ans=0;
	for(;left!=right;left++)ans+=(left->r-left->l+1)*(left->val==k);
	return ans;
}
void cntsort(int L,int R){
	Chtholly r=split(R+1),l=split(L);
	int c[26]={0};int pos=L;
	for(Chtholly ll=l;ll!=r;ll++)c[ll->val]+=(ll->r)-(ll->l)+1;
	st.erase(l,r);
	for(int i=0;i<26;i++){
		if(c[i]==0)continue;
		st.insert(ct(pos,pos+c[i]-1,i)),pos+=c[i];
	}
}
signed main(){
	scanf("%lld%lld",&n,&m);
	cin>>s+1;
	for(int i=1;i<=n;i++)st.insert(ct(i,i,s[i]-'A'));		
	st.insert(ct(n+1,n+1,0));
	while(m--){
		int l,r,op;
		char k;
		scanf("%lld%lld%lld",&op,&l,&r);
		if(op==1)cin>>k,printf("%lld\n",query(l,r,k-'A'));
		if(op==2)cin>>k,assign(l,r,k-'A');
		if(op==3)cntsort(l,r);
	}
	return 0;
}



2022/7/29 19:20
加载中...