求大佬看看 WA 10000% (自己看了好久没发现错误的地方)
查看原帖
求大佬看看 WA 10000% (自己看了好久没发现错误的地方)
267778
sfksf楼主2021/11/13 19:22
#include <bits/stdc++.h>
using namespace std;
#define ri register int 
#define M 133335 

struct dian{
	int l,r,lpos,rpos,id,tim;
	bool operator <(const dian t) const 
	{
		if(lpos==t.lpos)
		{
			if(rpos==t.rpos)
			{
				return tim<t.tim;
			}
			return r<t.r;
		}
		return lpos<t.lpos;
	}
}p[M];

struct gggg{
	int goall,val;
}xiu[M];

int val[M];
int n,m; 

void redyy()
{
	
	scanf("%d%d",&n,&m);
	for(ri i=1;i<=n;i++)
	scanf("%d",&val[i]);
	int d=pow(n,0.666);
	
	int trmp=0,cent=0;
	for(ri i=1;i<=m;i++)
	{
		char c;
		cin>>c; 
		if(c=='Q')
		{
		   int a,b;
		   scanf("%d%d",&a,&b);
		   p[++cent].l=a, p[cent].r=b, p[cent].id=cent, p[cent].tim=trmp; 
		   p[cent].lpos=a/d;p[cent].rpos=b/d;
		}
		if(c=='R')
		{
			int a,b;
			scanf("%d%d",&a,&b);
			xiu[++trmp].goall=a;
			xiu[trmp].val=b;
	    }
	}
	m=cent;
	sort(p+1,p+1+m);	
}

int num[M],cur;
int ans[M];

void jia(int a)
{
	if(!num[val[a]]) cur++;
	num[val[a]]++;
}

void jian(int a)
{
	if(num[val[a]]==1) cur--;
	num[val[a]]--;
} 
 
void gai(int a,int i)
{
	if(p[i].l<=xiu[a].goall&&xiu[a].goall<=p[i].r)
	{
		jian(xiu[a].goall);
	    swap(val[xiu[a].goall],xiu[a].val);
	    jia(xiu[a].goall);
	}
	
	else
	swap(val[xiu[a].goall],xiu[a].val);
}

void solvee()
{	
	int l=p[1].l;
	int r=l;
	
	jia(r);
	while(r<p[1].r) jia(++r);
	
	int t=0;
	
	while(t<p[1].tim) gai(++t,1);  
	                
	ans[p[1].id]=cur;
	
	for(ri i=2;i<=m;i++)
	{
		while(l<p[i].l) jian(l++);
		while(l>p[i].l) jia(--l);
		while(r<p[i].r) jia(++r);
		while(r>p[i].r) jian(r--);
		while(t<p[i].tim) gai(++t,i);
		while(t>p[i].tim) gai(t--,i);
		ans[p[i].id]=cur;
	}
	
	for(ri i=1;i<=m;i++)
	printf("%d\n",ans[i]);
}

int main(){
	
	redyy();
	solvee();
	return 0; 
}




2021/11/13 19:22
加载中...