样例没过但是AC
查看原帖
样例没过但是AC
1032437
oulii楼主2024/5/30 17:34
#include<bits/stdc++.h>
using namespace std;
int n,m,a[143323],b[1000001],block,ans[143323],answ,cnt;
struct ques
{
	int l,r,id,t;
}q1[143323],q2[143323];
bool cmp(ques x,ques y)
{
	if(x.l/block==y.l/block)
	{
		if(x.r/block==y.r/block)return x.t<y.t;
		return x.r<y.r;
	}
	return x.l<y.l;
}
inline void add(int x)
{
	if(b[x]==0)answ++;
	b[x]++;
}
inline void del(int x)
{
	b[x]--;
	if(b[x]==0)answ--;
}
inline void updata(int x,int t)
{
	if(q1[x].l<=q2[t].l && q2[t].l<=q1[x].r)//q2[x].l为要替换的位置
	{
		del(a[q2[t].l]);//q2[t].l位置上改为q2[t].r
		add(q2[t].r);
	}
	swap(a[q2[t].l],q2[t].r);//方便
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	block=pow(n,0.666);
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=m;i++)
	{
		int x,y;
		char op;
		cin>>op>>x>>y;
		if(op=='Q')
		{
			q1[++cnt].l=x;
			q1[cnt].r=y;
			q1[cnt].t=i-cnt;
			q1[cnt].id=cnt;
		}
		else
			q2[i-cnt].l=x,q2[i-cnt].r=y;
	}
	sort(q1+1,q1+m+1,cmp);
	int l=1,r=0,now=q1[1].t;
	for(int i=1;i<=m;i++)
	{
		while(r<q1[i].r)add(a[++r]);
		while(l<q1[i].l)del(a[l++]);
		while(r>q1[i].r)del(a[r--]);
		while(l>q1[i].l)add(a[--l]);
		while(now>q1[i].t)updata(i,now--);
		while(now<q1[i].t)updata(i,++now);
		ans[q1[i].id]=answ;
	}
	for(int i=1;i<=cnt;i++)
		cout<<ans[i]<<endl;
	return 0;
}
2024/5/30 17:34
加载中...