莫队TLE 60pts求助
查看原帖
莫队TLE 60pts求助
490314
小铭同学lym楼主2022/8/10 21:26
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
map<int,int>bj;
int a[N],totq,totp,len,Ans[N],n,m;
struct data
{
	int l,r,id,ti,kk;
}q[N],p[N];
bool cmp(data x,data y)
{
	if(x.l/len!=y.l/len)
		return x.l<y.l;
	if(x.r!=y.r)
		return x.r<y.r;
	return x.ti<y.ti;
}
void upt(int ti,int li)
{
	if(q[li].l<=p[ti].l&&p[ti].l<=q[li].r)
		bj[a[p[ti].l]]--,bj[p[ti].r]++;
	swap(a[p[ti].l],p[ti].r);
}
void add(int x)
{
	bj[a[x]]++;
}
void del(int x)
{
	bj[a[x]]--;
}
int main()
{
	scanf("%d%d",&n,&m);
	len=pow(n,2.00/3.00);
	for(int i=1;i<=n;++i)
		scanf("%d",&a[i]);
	char ch;
	for(int i=1,l,r,k;i<=m;++i)
	{
		scanf("\n%c",&ch);
		if(ch=='Q')
		{
			scanf("%d%d%d",&l,&r,&k);
			q[++totq].l=l,q[totq].r=r,q[totq].kk=k,q[totq].id=totq,q[totq].ti=totp;
		}
		else
		{
			scanf("%d%d",&l,&r);
			p[++totp].l=l,p[totp].r=r;
		}
	}
	sort(q+1,q+totq+1,cmp);
	for(int i=q[1].l;i<=q[1].r;++i)
		bj[a[i]]++;
	for(int i=1;i<=q[1].ti;++i)
		upt(i,1);
	Ans[q[1].id]=bj[q[1].kk];
	int l=q[1].l,r=q[1].r,ti=q[1].ti;
	for(int i=2;i<=totq;++i)
	{
		while(q[i].l<l) add(--l);
		while(q[i].r>r) add(++r);
		while(q[i].l>l) del(l++);
		while(q[i].r<r) del(r--);
		while(q[i].ti>ti) upt(++ti,i);
		while(q[i].ti<ti) upt(ti--,i);
		Ans[q[i].id]=bj[q[i].kk];
	} 
	for(int i=1;i<=totq;++i)
		printf("%d\n",Ans[i]);
}

RT

2022/8/10 21:26
加载中...