珂朵莉树70婚求条qwq
查看原帖
珂朵莉树70婚求条qwq
764676
ycr_sad楼主2024/8/13 10:50

马蜂尚且还好?

#include<iostream>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
struct intt
{
	int l,r;
	mutable char type;
	bool operator < (const intt &b) const
	{
		return l<b.l;
	}
	intt(int L,int R=0,char Type=' ')
	{
		l=L;
		r=R;
		type=Type;
	}
};
set<intt > odt;
int n,m;
auto split(int ops)
{
	auto it=odt.lower_bound(intt(ops));
	if(it->l==ops)
	  return it;
	it--;
	int L=it->l,R=it->r;
	char T=it->type;
	odt.erase(it);
	odt.insert(intt(L,ops-1,T));
	return odt.insert(intt(ops,R,T)).first;
}
void assign(int l,int r,char k)
{
	auto itr=split(r+1),itl=split(l);
	odt.erase(itl,itr);
	odt.insert(intt(l,r,k));
}
void sort_(int l,int r)
{
	vector<pair<char,int> > v;
	auto itr=split(r+1),itl=split(l);
	for(auto it=itl;it!=itr;it++)
	  v.push_back(make_pair(it->type,(it->r - it->l +1)));
	sort(v.begin(),v.end());
	odt.erase(itl,itr);
	int k=0;
	for(int i=l;i<=r;i++)
	{
		odt.insert(intt(i,i+v[k].second-1,v[k].first));
		i=i+v[k].second-1;
		k++;
	}
}
int query(int l,int r,char k)
{
	int sum=0;
	auto itr=split(r+1),itl=split(l);
	for(auto it=itl;it!=itr;it++)
	  if(it->type==k)
	    sum+=it->r - it->l +1;
	return sum;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		char k;
		cin>>k;
		if(k>='a'&&k<='z')
		  k-=32;
		odt.insert(intt(i,i,k));
	}
	odt.insert(intt(n+1,n+1,' '));
	for(int i=1;i<=m;i++)
	{
		int op,x,y;
		char k;
		cin>>op>>x>>y;
		if(op==1)
		{
			cin>>k;
			if(k>='a'&&k<='z')
		  	  k-=32;
			cout<<query(x,y,k)<<"\n";
		}
		if(op==2)
		{
			cin>>k;
			if(k>='a'&&k<='z')
		  	  k-=32;
			assign(x,y,k);
		}
		if(op==3)
		  sort_(x,y);
	}
}

谢谢dalao

悬关qwq

2024/8/13 10:50
加载中...