带修莫队样例过全RE求助
查看原帖
带修莫队样例过全RE求助
289304
HAuCl4楼主2022/10/16 16:56

RT

#include<bits/stdc++.h>
using namespace std;
const int N=133338,M=133338;
int n,m,k=0,up=0,a[N],cnt[N],belong[N];
struct node{
	int pos,jiu,xin;
}upd[M];
struct Cmd{
	int l,r,x,id;
	bool operator < (const Cmd& c) const{
		if(belong[l]!=belong[c.l]) return belong[l]<belong[c.l];
		if(belong[r]!=belong[c.r]) return belong[r]<belong[c.r];
		return x<c.x;
	}
}cmd[M];
int L=1,R=0,now=0,ans[M],nowup=0;
void change(int pos,int xin,int jiu,int tmp)
//tmp=1: xiu gai; tmp=-1: hui tui 
{
//	printf("change %d %d %d %d\n",pos,xin,jiu,tmp);
	if(pos>=L&&pos<=R)
	{
		cnt[xin]+=tmp;
		cnt[jiu]-=tmp;
		
		if(tmp==1)
		{
			if(cnt[xin]==1) now++;
			if(cnt[jiu]==0) now--;
		}
		else
		{
			if(cnt[jiu]==1) now++;
			if(cnt[xin]==0) now--;
		}	
	}
	if(tmp==1) a[pos]=xin;
	else a[pos]=jiu;
}
void add(int p) {if (++cnt[a[p]]==1) ++now;}
void remove(int p) {if(--cnt[a[p]]==0) --now;}
int main()
{
	scanf("%d%d",&n,&k);
	int s=n/floor(pow(k,2.0/3.0)+0.5);
	char yyy[3];
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),belong[i]=(i-1)/s+1;
	for(int i=1;i<=k;i++)
	{
		scanf("%s",yyy);
		if(yyy[0]=='R')
		{
			up++;
			scanf("%d%d",&upd[up].pos,&upd[up].xin);
			upd[up].jiu=a[upd[up].pos];
//			printf("upd[up].pos=%d a=%d\n",upd[up].pos,upd[up].jiu);
		}
		else
		{
			m++;
			scanf("%d%d",&cmd[m].l,&cmd[m].r);
			cmd[m].id=m;
			cmd[m].x=up;
		}
	} 
	sort(cmd+1,cmd+m+1);
	for(int i=1;i<=m;i++)
	{
//		printf("i=%d\n",i);
//		for(int i=1;i<=5;i++) printf("%d ",cnt[i]); printf("\n");
		while(nowup<cmd[i].x) 
		{
			nowup++;
			change(upd[nowup].pos,upd[nowup].xin,upd[nowup].jiu,1);
//			printf("nowup=%d %d\n",nowup,upd[nowup].jiu);
		}
		while(nowup>cmd[i].x) 
		{
			nowup--;
			change(upd[nowup].pos,upd[nowup].xin,upd[nowup].jiu,-1);
		}
		while(L>cmd[i].l) add(--L);
		while(R<cmd[i].r) add(++R);
		while(L<cmd[i].l) remove(L++);
		while(R>cmd[i].r) remove(R--);
		
		ans[cmd[i].id]=now;
	}
	for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
	return 0;
}
2022/10/16 16:56
加载中...