【悲】好不容易调出来了,然而TLE 5~10,求助!
查看原帖
【悲】好不容易调出来了,然而TLE 5~10,求助!
317568
AuKr楼主2020/5/2 15:03
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;

#define read(x) scanf("%d",&x)

int n,m,l,r;
int a[150000];
int cnt[1000005]={0};
char c;
struct node
{
	int l,pos,r,t,id;
}q[150000];
int cc=0;
int ch[150000],to[150000],h;
int lst[150000],b[150000],ans[150000];

bool cmp(node n,node m)
{
	if(n.pos^m.pos) return n.pos<m.pos;
	else if(n.r^m.r) return n.r<m.r;
	else return n.t<m.t;
}

int main()
{
	read(n),read(m);
	for(int i=1;i<=n;i++) read(a[i]),b[i]=a[i];
	h=pow(n,0.66666666667);
	for(int i=1;i<=m;i++)
	{
		cin>>c;
		read(l),read(r);
		if(c=='Q')
		{
			q[++cc].pos=n/h;
			q[cc].l=l,q[cc].r=r;
			q[cc].t=i;
			q[cc].id=cc;
		}
		else
		{
			if(i==1) a[ch[i]]=to[i];
			ch[i]=l,to[i]=r;
			lst[i]=b[l];
			b[l]=r;
		}
	}
	sort(q+1,q+cc+1,cmp);
	int l=1,r=0,t=0,now=0;
	for(int i=1;i<=cc;i++)
	{
		while(q[i].l<l){l--;if(!cnt[a[l]]) now++;cnt[a[l]]++;}
		while(q[i].l>l){cnt[a[l]]--;if(!cnt[a[l]]) now--;l++;}
		while(q[i].r>r){r++;if(!cnt[a[r]]) now++;cnt[a[r]]++;}
		while(q[i].r<r){cnt[a[r]]--;if(!cnt[a[r]]) now--;r--;}
		while(q[i].t>t)
		{
			t++;
			if(ch[t])
			{
				if(ch[t]>=l&&ch[t]<=r)
				{
					cnt[lst[t]]--;
					if(!cnt[lst[t]]) now--;
					if(!cnt[to[t]]) now++;
					cnt[to[t]]++;
				}
				a[ch[t]]=to[t];
			}
		}
		while(q[i].t<t)
		{
			if(ch[t])
			{
				if(ch[t]>=l&&ch[t]<=r)
				{
					cnt[to[t]]--;
					if(!cnt[to[t]]) now--;
					if(!cnt[lst[t]]) now++;
					cnt[lst[t]]++;
				}
				a[ch[t]]=lst[t];
			}
			t--;
		}
		ans[q[i].id]=now;
	}
	for(int i=1;i<=cc;i++) printf("%d\n",ans[i]);
	return 0;
}

谢谢大佬

2020/5/2 15:03
加载中...