珂朵莉树TLE最后一点
查看原帖
珂朵莉树TLE最后一点
214728
剑雪清寒楼主2022/9/29 12:47

rt,不知道这题是不是真的卡odt了.倒数第二点132ms,求助卡常

#include <bits/stdc++.h>
using namespace std;
inline long long read() {
	long long x;bool f;char ch;
	for(f=0;!isdigit(ch=getchar());f=ch=='-');
	for(x=ch-48;isdigit(ch=getchar());x=x*10+ch-48);
	return f?-x:x;
}
inline void print(long long x,char las) {
	if(!x) {
		putchar(48),putchar(las);
		return ;
	}
	if(x<0) putchar('-'),x=-x;
	int ls[20],k=0;
	while(x) ls[++k]=x%10,x/=10;
	while(k) putchar(ls[k--]+48);
	putchar(las);
	return ;
}
int n=read(),m=read();
struct Node_t {
	int l,r;
	mutable int v;
	inline Node_t(const int&ll,const int&rr,const int&vv) : l(ll),r(rr),v(vv) {}
	inline bool operator<(const Node_t&ls) const {
		return l<ls.l;
	}
};
set<Node_t>chtholly;
inline auto split(int x) {
	if(x>n) return chtholly.end();
	auto it=--chtholly.upper_bound(Node_t(x,0,0));
	if(it->l==x) return it;
	int l=it->l,r=it->r,v=it->v;
	chtholly.erase(it);
	chtholly.insert(Node_t(l,x-1,v));
	return chtholly.insert(Node_t(x,r,v)).first;
}
inline void assign(int l,int r,int v) {
	auto itr=split(r+1),itl=split(l);
	chtholly.erase(itl,itr);
	chtholly.insert(Node_t(l,r,v));
}
inline int check(int l,int r,int d) {
	int res=0;auto itr=split(r+1),itl=split(l);
	for(register auto it=itl;it!=itr;it++) res+=(it->v==d)*(it->r-it->l+1);
	auto k=itl;
	while(k->v==itl->v) {
		l=k->l;
		if(k->l==1) break;
		k--;
	}
	k=itl;
	while(k->v==itl->v) {
		r=k->r;
		if(k->r==n) break;
		k++;
	}
	assign(l,r,itl->v);
	return res;
}
struct nd {
	int value,cnt;
	inline nd(const int&va,const int&cn) : value(va),cnt(cn) {}
	inline bool operator<(const nd&ls) const {
		return value<ls.value;
	}
};
inline void sot(int l,int r) {
	vector<nd>vec;auto itr=split(r+1),itl=split(l);
	for(register auto it=itl;it!=itr;it++) vec.push_back(nd(it->v,it->r-it->l+1));
	chtholly.erase(itl,itr);
	sort(vec.begin(),vec.end());int ll=l,lv=vec[0].value,len=vec[0].cnt;
	for(register int i=1;i<vec.size();i++) {
		if(vec[i].value!=lv) {
			chtholly.insert(Node_t(ll,ll+len-1,lv));ll+=len;lv=vec[i].value;len=vec[i].cnt;
		}else len+=vec[i].cnt;
	}
	chtholly.insert(Node_t(ll,ll+len-1,lv));
	auto it=chtholly.lower_bound(Node_t(l,0,0));
	auto k=it;
	while(k->v==it->v) {
		l=k->l;
		if(k->l==1) break;
		k--;
	}
	assign(l,it->r,it->v);
	k=it=chtholly.lower_bound(Node_t(ll,0,0));
	while(k->v==it->v) {
		r=k->r;
		if(k->r==n) break;
		k++;
	}
	assign(it->l,r,it->v);
	return ;
}
int main() {
	int ls=1;char lw;
	cin>>lw;if(lw>='a') lw-='a'-'A';
	for(int i=2;i<=n;i++) {
		char k;
		cin>>k;if(k>='a') k-='a'-'A';
		if(k!=lw) chtholly.insert(Node_t(ls,i-1,lw-'A')),lw=k,ls=i;
	}
	chtholly.insert(Node_t(ls,n,lw-'A'));
	while(m--) {
		int opt=read(),l=read(),r=read();
		if(opt==1) {
			char k;cin>>k;if(k>='a') k-='a'-'A';
			print(check(l,r,k-'A'),'\n');
		}else if(opt==2) {
			char k;cin>>k;if(k>='a') k-='a'-'A';
			assign(l,r,k-'A');
			auto it=chtholly.lower_bound(Node_t(l,0,0));
			auto ti=it;
			while(ti->v==it->v) {
				l=ti->l;
				if(ti->l==1) break;
				ti--;
			}
			ti=it;
			while(ti->v==it->v) {
				r=ti->r;
				if(ti->r==n) break;
				ti++;
			}
			assign(l,r,k-'A');
		}else sot(l,r);
	}
	return 0;
}

2022/9/29 12:47
加载中...