6个TLE
查看原帖
6个TLE
339299
osfly楼主2022/5/13 13:26
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
struct query
{
	int l,r;
	int id;
	int ch;
}q[1000010];
struct change
{
	int x;
	int val;
}c[1000010];
int belong[1000010];
bool cmp(query a,query b)
{
	if(a.l!=b.l) return belong[a.l]<belong[b.l];
	if(a.r!=b.r) return belong[a.r]<belong[b.r];
	return a.ch<b.ch;
}
int n,m;
int block;
int a[1000010];
int cnum,qnum;
int nl=1,nr,nc;
int b[1000010];
int now;
int ans[1000010];
inline void swap(int &x,int &y)
{
	int tmp=x;
	x=y;
	y=tmp;
}
inline void add(int x)
{
	if(++b[x]==1) now++;
}
inline void del(int x)
{
	if(--b[x]==0) now--;
}
inline void upd(int x,int i)
{
	if(c[x].x>=q[i].l&&c[x].x<=q[i].r)
	{
		del(a[c[x].x]);
		add(c[x].val);
	}
	swap(c[x].val,a[c[x].x]);
}
int main()
{
	scanf("%d%d",&n,&m);
	block=pow(n,0.666666);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		belong[i]=(i-1)/block+1;
	}
	for(int i=1;i<=m;i++)
	{
		char ch;
		scanf(" %c",&ch);
		if(ch=='Q')
		{
			qnum++;
			scanf("%d%d",&q[qnum].l,&q[qnum].r);
			q[qnum].id=qnum;
			q[qnum].ch=cnum;
		}
		else
		{
			++cnum;
			scanf("%d%d",&c[cnum].x,&c[cnum].val);
		}
	}
	sort(q+1,q+1+qnum,cmp);
	for(int i=1;i<=qnum;i++)
	{
		int L=q[i].l,R=q[i].r,C=q[i].ch;
		while(nl<L) del(a[nl++]);
		while(nl>L) add(a[--nl]);
		while(nr<R) add(a[++nr]);
		while(nr>R) del(a[nr--]);
		while(nc<C) upd(++nc,i);
		while(nc>C) upd(nc--,i);
		ans[q[i].id]=now;
	}
	for(int i=1;i<=qnum;i++) printf("%d\n",ans[i]);
	return 0;
}
2022/5/13 13:26
加载中...