萌新刚学莫队,TLE两个点
查看原帖
萌新刚学莫队,TLE两个点
171544
cp152楼主2021/8/4 21:47
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct ABC{
	int l,r,t,num;
}b[2000005];
struct AB{
	int a,b;
}ch[2000005];
int n,m,cnt1,cnt2,s,sum;
int a[2000005];
int c[10000005];
int ans[2000005];
bool cmp(ABC a,ABC b)
{
	if(a.l/s!=b.l/s)	return a.l<b.l;
	if(a.r/s!=b.r/s)
	{
		if((a.l/s)&1)	return a.r<b.r;
		return	a.r>b.r;
	}
	if((a.r/s)&1)	return a.t<b.t;
	return a.t>b.t;
//	return a.r<b.r;
}
inline void add(int x)
{
	sum+=!c[x]++;
}
inline void del(int x)
{
	sum-=!--c[x];
}
int main()
{
	scanf("%d%d",&n,&m);
	for(register int i=1;i<=n;++i)
	{
		scanf("%d",&a[i]);
	}
	for(register int i=1;i<=m;++i)
	{
		char z;
		int x,y;
		scanf("\n%c%d%d",&z,&x,&y);
		if(z=='Q')
		{
			b[++cnt1].l=x;
			b[cnt1].r=y;
			b[cnt1].t=cnt2;
			b[cnt1].num=cnt1;
		}
		else
		{
			ch[++cnt2].a=x;
			ch[cnt2].b=y;
		}
	}
	for(;s*s*s<n*n;++s);
	s=max(s,1);
	sort(b+1,b+cnt1+1,cmp);
	int l=b[1].l,r=b[1].l-1,t=0;
	for(register int i=1;i<=m;i++)
	{
		for(;l>b[i].l;)
		{
			add(a[--l]);
		}
		for(;r<b[i].r;)
		{
			add(a[++r]);
		}
		for(;l<b[i].l;)
		{
			del(a[l++]);
		}
		for(;r>b[i].r;)
		{
			del(a[r--]);
		}
		for(;t<b[i].t;)
		{
			int tmp=a[ch[++t].a];
			a[ch[t].a]=ch[t].b;
			if(b[i].l<=ch[t].a&&ch[t].a<=b[i].r)
			{
				del(tmp);
				add(ch[t].b);
			}
			ch[t].b=tmp;
		}
		for(;t>b[i].t;)
		{
			int tmp=a[ch[t].a];
			a[ch[t].a]=ch[t].b;
			if(b[i].l<=ch[t].a&&ch[t].a<=b[i].r)
			{
				del(tmp);
				add(ch[t].b);
			}
			ch[t--].b=tmp;
		}
		ans[b[i].num]=sum;
	}
	for(register int i=1;i<=cnt1;i++)
	{
		printf("%d\n",ans[i]);
	}
	return 0;
}

记录详情

2021/8/4 21:47
加载中...