TLE 76分求调
查看原帖
TLE 76分求调
244294
__Chtholly楼主2023/7/16 15:08
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
#define ll long long 

const ll N=2e6+5;
ll n,q;
ll a[N];
ll cnt[N];
ll ans[N];

ll block;
//struct node{
//	ll l,r,tag,sum;	
//}Tree[N<<2];
char op;
struct Que{
	ll id,l,r,time;
	bool operator<(const Que&b) const{
		if( (l/block) != (b.l/block))return (l/block)<(b.l/block);
		else if((r/block) != (b.l/block))return (r/block)<(b.r/block);
		return time<b.time;
	}
}Q[N];
ll numQ;

struct Modui{
	ll num,col;	
}M[N];
ll numM;

void add(ll x,ll& number){
	cnt[x]++;
	if(cnt[x]==1)
		number++;
}
void del(ll x,ll& number){
	cnt[x]--;
	if(cnt[x]==0)
		number--;	
}

signed main(){
	scanf("%lld%lld",&n,&q);block=pow(n,2.0/3.0);
	for(register ll i=1;i<=n;++i)	
		scanf("%lld",&a[i]);
	for(register ll i=1;i<=q;++i){
		while(op=getchar())
			if(op=='Q'||op=='R')
				break;
		if(op == 'R'){
			ll a,b;
			scanf("%lld%lld",&a,&b);
			M[++numM].num=a;
			M[numM].col=b;
		}
		else{
			ll l,r;
			scanf("%lld%lld",&l,&r);
			Q[++numQ].id=numQ;
			Q[numQ].l=l;
			Q[numQ].r=r;
			Q[numQ].time=numM;
		}
	}	
	sort(Q+1,Q+1+numQ);
	for(register ll l1=1,r1=0,tmp=0,res=0,id,l,r,tim,j=1;j<=numQ;++j){
		id=Q[j].id,l=Q[j].l,r=Q[j].r,tim=Q[j].time;
		while(r1<r)
			add(a[++r1],res);
		while(r1>r)
			del(a[r1--],res);
		while(l1<l)
			del(a[l1++],res);
		while(l1>l)
			add(a[--l1],res);
		while(tmp<tim){
			if(l<=M[++tmp].num && M[tmp].num<=r){
				del(a[M[tmp].num],res);
				add(M[tmp].col,res);
			}
			ll t=a[M[tmp].num];
			a[M[tmp].num]=M[tmp].col;
			M[tmp].col=t;
		}
		while(tmp>tim){
			if(l<=M[tmp].num && M[tmp].num<=r){
				del(a[M[tmp].num],res);
				add(M[tmp].col,res);	
			}
			ll t=a[M[tmp].num];
			a[M[tmp].num]=M[tmp].col;
			M[tmp].col=t;
			tmp--;
		}
		ans[id]=res;
		
	}
	for(register ll i=1;i<=numQ;++i)
		printf("%lld\n",ans[i]);
	return 0;
}

2023/7/16 15:08
加载中...