MnZn 求助 全 RE,悬1关注
查看原帖
MnZn 求助 全 RE,悬1关注
663638
Butterfly_qwq楼主2024/1/23 09:28

这个小菜狗已经和第一篇题解对拍5000+组数据没有问题了

#include<bits/stdc++.h>
#define blk(i) ((i)/B)
using namespace std;
int a[233333],ans[233333],rec[1919810],s,cnt,T,n,m,B;
struct query
{
	int l,r,t,no;
	bool operator<(query a)
	{
		if(blk(l)^blk(a.l))return blk(l)<blk(a.l);
		if(blk(r)^blk(a.r))return blk(r)<blk(a.r);
		return t<a.t;
	}
}q[233333];
struct update
{
	int l,c;
}u[233333];
void add(int u)
{
	s+=!rec[u]++;
}
void del(int u)
{
	s-=!--rec[u];
}
void upd(int x,int t)
{
	if(q[x].l<=u[t].l&&u[t].l<=q[x].r)
	{
		del(a[u[t].l]);
		add(u[t].c);
	}
	swap(a[u[t].l],u[t].c);
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1,l,r;i<=m;i++)
	{
		string op;
		cin>>op>>l>>r;
		if(op=="Q")
		{
			cnt++;
			q[cnt]={l,r,T,cnt};
		}//据说q[++cnt]={l,r,T,cnt};会导致W&L不一致 
		else u[++T]={l,r};
	}
	B=max(cbrt(1ll*n*T),1.0);
	sort(q+1,q+cnt+1);
	int l,r,t;
	for(int i=1;i<=cnt;i++)
	{
		while(l>q[i].l)add(a[--l]);
		while(l<q[i].l)del(a[l++]);
		while(r>q[i].r)del(a[r--]);
		while(r<q[i].r)add(a[++r]);
		while(t<q[i].t)upd(i, ++t);
		while(t>q[i].t)upd(i, t--);
		ans[q[i].no]=s;
	}
	for(int i=1;i<=cnt;i++)cout<<ans[i]<<'\n';
}
2024/1/23 09:28
加载中...