萌新求调
查看原帖
萌新求调
141179
pigstd楼主2020/12/19 18:57

不知道为啥 WA on 9,感觉写的没啥问题/kel,求巨佬看看/kk

#include<bits/stdc++.h>
using namespace std;

const int M=1e6+10;

struct change
{
	int p,c;
}C[M];int cnt1;

struct query
{
	int l,r,t,id,ans;
}Q[M];int cnt2;

int n,q,t,bl,a[M],p[M],ans;

int id(int k){return k/bl;}

bool cmp1(query a,query b)
{return id(a.l)<id(b.l)||(id(a.l)==id(b.l)&&id(a.r)<id(b.r))||(id(a.l)&&id(b.l)&&id(a.r)==id(b.r)&&id(a.t)<id(b.t));}

bool cmp2(query a,query b){return a.id<b.id;}

void add(int k)
{
	if (p[k]==0)ans++;
	p[k]++;
}

void del(int k)
{
	if (p[k]==1)ans--;
	p[k]--;
}

void upd(int p,int t)
{
	if (C[t].p<=Q[p].r&&C[t].p>=Q[p].l)
		del(a[C[t].p]),add(C[t].c);
	swap(a[C[t].p],C[t].c);
}

int main()
{
	cin>>n>>q;
	for (int i=1;i<=n;i++)cin>>a[i];
	bl=pow(n,0.666666);
	for (int i=1;i<=q;i++)
	{
		char ch;scanf("%s",&ch);
		if (ch=='Q')
		{
			cnt2++;
			cin>>Q[cnt2].l>>Q[cnt2].r;Q[cnt2].id=i,Q[cnt2].t=cnt1;
		}
		else
		{
			cnt1++;
			cin>>C[cnt1].p>>C[cnt1].c;
		}
	}
	sort(Q+1,Q+cnt2+1,cmp1);
	int l=1,r=0,now=0;
	for (int i=1;i<=cnt2;i++)
	{
		while(l>Q[i].l)l--,add(a[l]);
		while(l<Q[i].l)del(a[l]),l++;
		while(r>Q[i].r)del(a[r]),r--;
		while(r<Q[i].r)r++,add(a[r]);
		while(now<Q[i].t)now++,upd(i,now);
		while(now>Q[i].t)upd(i,now),now--;
		Q[i].ans=ans;
	}
	sort(Q+1,Q+1+cnt2,cmp2);
	for (int i=1;i<=cnt2;i++)cout<<Q[i].ans<<endl;
	return 0;
}
2020/12/19 18:57
加载中...