玄学求问
查看原帖
玄学求问
552811
lzx390楼主2024/7/24 19:59
#include<cstdio>
#include<algorithm>
using namespace std;
struct que
{
	int l,r,t,ans,p;
}q[2000005];
pair<int,int> c[3000005];
int n,m,cnt[3000005],ans,sum,a[200005],tot;
int b[2000005],k1,k2=1,x,y,l=1,r,t,lst[2000005];
int read()
{
	int ret=0;
	char ch=getchar();
	while(ch<'0' || ch>'9') ch=getchar();
	while(ch>='0' && ch<='9') 
	{
		ret=(ret<<3)+(ret<<1)+(ch-'0');
		ch=getchar();
	}
	return ret;
}
bool cmp1(que x,que y) {return x.l<y.l;}
bool cmp2(que x,que y) {return x.r<y.r;}
bool cmp3(que x,que y) {return x.t<y.t;}
bool cmp4(que x,que y) {return x.p<y.p;}
void upd(int col,int v)
{
	if(!cnt[col] && v==1) ans++;
	if(cnt[col]==1 && v==-1) ans--;
	cnt[col]+=v;
}
int main()
{
	n=read();m=read();
	for(int i=1;i<=n;i++) b[i]=a[i]=read();
	for(int i=1;i<=m;i++)
	{
		char ch=getchar();
		while(ch!='Q' && ch!='R') ch=getchar();
		x=read();y=read();
		if(ch=='Q') 
		{
			q[++sum].l=x;q[sum].r=y;
			q[sum].p=sum;q[sum].t=tot;
		}
		else c[++tot]=make_pair(x,y);
	}
	for(int i=1;i<=tot;i++)
	{
		int x=c[i].first,y=c[i].second;
		lst[i]=b[x];b[x]=y;
	}
	k1=max(sum/50,1);k2=max(k1/50,1);
	sort(q+1,q+sum+1,cmp1);
	for(int i=1;i<=sum;i+=k1)
	{
		int t=min(i+k1,sum+1);
		sort(q+i,q+t,cmp2);
		for(int j=i;j<=t;j+=k2)
		{
			int tt=min(j+k2,t);
			sort(q+j,q+tt,cmp3);
		}
	}
	for(int i=1;i<=sum;i++)
	{
		while(t<q[i].t)
		{
			int x=c[++t].first,y=c[t].second;
			if(x>=l && x<=r) {upd(a[x],-1);a[x]=y;upd(y,1);}
			else a[x]=y;
		}
		while(t>q[i].t)
		{
			int x=c[t].first,y=c[t--].second;
			if(x>=l && x<=r) {upd(y,-1);a[x]=lst[t+1];upd(a[x],1);}
			else a[x]=lst[t+1];
		}
		while(l<q[i].l) upd(a[l++],-1);
		while(l>q[i].l) upd(a[--l],1);
		while(r<q[i].r) upd(a[++r],1);
		while(r>q[i].r) upd(a[r--],-1);
		q[i].ans=ans;
	}
	sort(q+1,q+sum+1,cmp4);
	for(int i=1;i<=sum;i++) printf("%d\n",q[i].ans);
	return 0;
}
在upd中如果我把v==1 删了就会全WA.但cnt[col]=0时还能再减吗,为什么会出现cnt[col]<0啊
2024/7/24 19:59
加载中...