AC后三个点求助
查看原帖
AC后三个点求助
167279
Danno0v0楼主2022/2/19 10:41

学带修莫队调吐了……

救救孩子吧

#include<bits/stdc++.h>
using namespace std;
struct que
{
	int l,r,t,s;
}q[1000001];
struct cha
{
	int p,x,last;
}c[1000001];
int n,m,F;
int ans_[1000001];
int cntq,cntc;
int color[1000001];
int sum[1000001];
bool cmp(que a,que b)
{
	if(a.l/F!=b.l/F) return a.l/F<b.l/F;
	else if(a.r/F!=b.r/F) return a.r/F<b.r/F;
	else return a.t<b.t;
}
int main()
{
	cin>>n>>m;
	F=pow(n,1.0/3);
	for(int i=1;i<=n;i++)
	{
		cin>>color[i];
	}
	char x;
	int y,z;
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y>>z;
		if(x=='Q')
		{
			q[++cntq].l=y;
			q[cntq].r=z;
			q[cntq].t=cntc;
			q[cntq].s=cntq;
		}
		else
		{
			c[++cntc].p=y;
			c[cntc].x=z;
		}
	}
	sort(q+1,q+cntq+1,cmp);	
	int L=1,R=1,T=0,ans=0;
	for(;T<cntc;)
	{
		T++;
		c[T].last=color[c[T].p];
		color[c[T].p]=c[T].x;
	}
	sum[color[L]]++;
	ans++;
	for(int i=1;i<=cntq;i++)
	{
		while(R<q[i].r)
		{
			R++;
			if(++sum[color[R]]==1) ans++;
		}
		while(R>q[i].r)
		{
			if(!(--sum[color[R]])) ans--;
			R--;
		}
		while(L>q[i].l)
		{
			L--;
			if(++sum[color[L]]==1) ans++;
		}
		while(L<q[i].l)
		{
			if(!(--sum[color[L]])) ans--;
			L++;
		}
		while(T>q[i].t)
		{
			if(!(--sum[color[c[T].p]])) ans--;
			color[c[T].p]=c[T].last;
			if(++sum[color[c[T].p]]==1) ans++;
			T--;
		}
		while(T<q[i].t)
		{
			T++;
			if(!(--sum[color[c[T].p]])) ans--;
			color[c[T].p]=c[T].x;
			if(++sum[color[c[T].p]]==1) ans++;
		}
		ans_[q[i].s]=ans;
	}
	for(int i=1;i<=cntq;i++)
	{
		cout<<ans_[i]<<endl;
	}
}
/*
7 7
1 2 3 4 5 6 7
Q 1 7
Q 2 7
Q 3 7
R 5 6
Q 1 7
R 7 1
Q 1 7

7 3
1 2 3 4 5 6 7 
Q 1 7
R 1 2
R 3 4
*/
2022/2/19 10:41
加载中...