88分 TLE on #9 #10求救
查看原帖
88分 TLE on #9 #10求救
730113
Rolen楼主2024/12/1 21:20
#include<bits/stdc++.h>
using namespace std;
#define ll int
ll n,m,a[1303335],mp[1000006],ls,rs,cnt,blk,t,sum,ans[1330335];
struct node{
	ll x,y,z;
}r[1303335],q[1303335];
char opt;
bool cmp(node c,node d){
	if(c.x/blk!=d.x/blk){
		return c.x<d.x;
	}
	if(c.y/blk!=d.y/blk) return c.y<d.y;
	return c.z<d.z;
}
void add(ll p,ll num){
	if(num==1){
		if(!mp[p]) ++sum;
		++mp[p];
	}
	else{
		if(mp[p]==1) --sum;
		--mp[p];
	}
}
int main(){
	cin>>n>>m;
	blk=pow(n,0.667)+1;
	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
	for(int i=1;i<=m;++i){
		scanf("%c",&opt);
		cin>>opt;
		if(opt=='R') scanf("%d%d",&r[i].x,&r[i].y),ans[i]=-1; 
		else 
		cnt++,scanf("%d%d",&q[cnt].x,&q[cnt].y),q[cnt].z=i;
	}
	sort(q+1,q+1+cnt,cmp);
	ls=rs=1;
	sum=mp[a[1]]=1;
	for(int i=1;i<=cnt;++i){
		while(ls<q[i].x){
			add(a[ls],-1);
			++ls;
		}
		while(ls>q[i].x){
			--ls;
			add(a[ls],1);
		}
		while(rs<q[i].y){
			++rs;
			add(a[rs],1);
		}
		while(rs>q[i].y){
			add(a[rs],-1);
			--rs;
		}
		while(t<q[i].z){
			++t;
			if(r[t].y){
				if(r[t].x<=rs&&r[t].x>=ls){
					add(a[r[t].x],-1);
					add(r[t].y,1);
				}
				swap(r[t].y,a[r[t].x]);
			}
		}
		while(t>q[i].z){
			--t;
			if(r[t].y){
				if(r[t].x<=rs&&r[t].x>=ls){
					add(a[r[t].x],-1);
					add(r[t].y,1);
				}
				swap(r[t].y,a[r[t].x]);
			}
		}
		ans[q[i].z]=sum;
	}
	for(int i=1;i<=m;++i){
		if(ans[i]!=-1) printf("%d\n",ans[i]);
	}
}
2024/12/1 21:20
加载中...