求助!64分
查看原帖
求助!64分
1127126
yueyan_WZF楼主2024/7/21 16:33

TLE#7至#12

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+20;
int s,n,cnt,num,tot,m;
int a[N],b[N],c;
int ans[N];
struct node{
	int l,r,time,id;
}z[N],g[N];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
bool cmp(node x,node y){
	if(x.l!=y.l){
		return x.l<y.l;
	}
	if(x.r!=y.r){
		return x.r<x.r;
	}
		return x.time<y.time;
}

/*bool cmp (const node &a, const node &b)
{
	return a.l / s == b.l / s ? a.r / s == b.r / s ? a.time < b.time : a.r < b.r : a.l < b.l;
}*/

inline void add(int x){
	if(b[x]==0){
		c++;
	}
	b[x]++;
}
inline void del(int x){
	if(b[x]==1){
		c--;
	}
	b[x]--;
}

void xiu(int i,int x){
	if(z[i].l<=g[x].l&&g[x].l<=z[i].r ){	
		add(g[x].r);
		del(a[g[x].l]);
	
	}
	swap(a[g[x].l],g[x].r);
	//aacout<<a[g[x].l]<<endl;
}

int main(){
	n=read(),m=read();
	 s = pow(n, 2.0/3.0);
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	for(int i=1;i<=m;i++){
		int x,y;
		char opt;
		cin>>opt;
		x=read(),y=read();
		//cout<<x<<" "<<y<<endl;
		if(opt=='Q'){
			cnt++;
			z[cnt].l=x;
			z[cnt].r=y;
			z[cnt].id=cnt;
			z[cnt].time=tot;
		}
		else{
			tot++;
			g[tot].l=x;
			g[tot].r=y;
		}
	}
	sort(z+1,z+1+cnt,cmp);
	int ll=1,rr=0,tt=0;
	for(int i=1;i<=cnt;i++){
		int il=z[i].l,ir=z[i].r,it=z[i].time;
		while(ll>il){
			ll--;
			add(a[ll]);
		
		}
		while(rr>ir){
			del(a[rr]);
			rr--;
		}
		while(ll<il){
			del(a[ll]);
			ll++;
		}
		while(rr<ir){	
			rr++;
			add(a[rr]);
		
		}
		while(tt<it){
			tt++;
			xiu(i,tt);
		
		}
		while(tt>it){
			xiu(i,tt);
			tt--; 
		}
		ans[z[i].id]=c;
		//cout<<c<<endl; 
	}
	for(int i=1;i<=cnt;i++){
		printf("%d\n",ans[i]);
	}
}
2024/7/21 16:33
加载中...