TLE求调
查看原帖
TLE求调
779456
liaochengrui楼主2025/2/7 15:30

p.s.我按着讨论区把能优化的都优化了,还是T...

#include<bits/stdc++.h>
using namespace std;
const int N=133335,M=1000005;
struct node{
	int l,r,id,tim;
}q[N];
struct upd{
	int pre,col,pos;
}c[N];
int read(){
	int num=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')  f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		num=(num<<1)+(num<<3)+ch-'0';
		ch=getchar();
	}
	return num*f;
}
int n,m,k,ql=0,cl=0;
int a[N],idx[N],t[M];
int last[N];
int ans[N];
bool cmp1(const node &x,const node &y){
	if(idx[x.l]!=idx[y.l])  return idx[x.l]<idx[y.l];
	if(x.r!=y.r)  return x.r<y.r;
	return x.tim<y.tim;
}
void work(){
	int l=1,r=1,s=1,now=0;
	t[a[1]]++;
	for(int i=1;i<=ql;++i){
		for(int j=now+1;j<=q[i].tim;++j){
			if(c[j].pos>=l&&c[j].pos<=r){
				t[c[j].pre]--;
				if(t[c[j].pre]==0)  s--;
				t[c[j].col]++;
				if(t[c[j].col]==1)  s++;
			}
			a[c[j].pos]=c[j].col;
		}
		for(int j=now;j>=q[i].tim+1;--j){
			if(c[j].pos>=l&&c[j].pos<=r){
				t[c[j].col]--;
				if(t[c[j].col]==0)  s--;
				t[c[j].pre]++;
				if(t[c[j].pre]==1)  s++;
			}
			a[c[j].pos]=c[j].pre;
		}
		while(l>q[i].l){
			l--;
			t[a[l]]++;
			if(t[a[l]]==1)  s++;
		}
		while(r<q[i].r){
			r++;
			t[a[r]]++;
			if(t[a[r]]==1)  s++;
		}
		while(l<q[i].l){
			t[a[l]]--;
			if(t[a[l]]==0)  s--;
			l++;
		}
		while(r>q[i].r){
			t[a[r]]--;
			if(t[a[r]]==0)  s--;
			r--;
		}
		ans[q[i].id]=s;
		now=q[i].tim;
	}
}
int main(){
	n=read();m=read();
	memset(t,0,sizeof(t));
	k=pow(n,0.666);
	for(int i=1;i<=n;++i){
		a[i]=read();
		last[i]=a[i];
		idx[i]=(i-1)/k+1;
	}
	for(int i=1;i<=m;++i){
		char opt[3];
		cin>>opt;
		int xi=read(),yi=read();
		if(opt[0]=='Q'){
			q[++ql].l=xi;
			q[ql].r=yi;
			q[ql].id=ql;
			q[ql].tim=cl;
		}
		else{
			c[++cl].pre=last[xi];
			c[cl].col=yi;
			c[cl].pos=xi;
			last[xi]=yi;
		}
	}
	sort(q+1,q+ql+1,cmp1);
	work();
	for(int i=1;i<=ql;++i)
	  printf("%d\n",ans[i]);
	return 0;
}
2025/2/7 15:30
加载中...