数颜色 / 维护队列(带修莫队板子)

Posted thusloop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数颜色 / 维护队列(带修莫队板子)相关的知识,希望对你有一定的参考价值。

数颜色

//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf=8e18;
const int maxn=1e6+100;
int a[maxn],pos[maxn],cnt[maxn],ans,l,r;
int res[maxn];
int sz;
struct node
{
	int l,r;
	int id,ti;
} t[maxn];
struct node2
{
	int x,col;
} t2[maxn];
bool cmp(node a,node b)
{
	if(pos[a.l]!=pos[b.l])return pos[a.l]<pos[b.l];
	if(pos[a.r]!=pos[b.r])return pos[a.r]<pos[b.r];
	return a.ti<b.ti;
}
void add(int x)
{
	cnt[a[x]]++;
	if(cnt[a[x]]==1)ans++;
}
void del(int x)
{
	cnt[a[x]]--;
	if(cnt[a[x]]==0)ans--;
}
void change(int ti)
{
	if(l<=t2[ti].x&&t2[ti].x<=r)
	{
		cnt[a[t2[ti].x]]--;
		if(cnt[a[t2[ti].x]]==0)ans--;
		cnt[t2[ti].col]++;
		if(cnt[t2[ti].col]==1)ans++;
	}
	swap(t2[ti].col,a[t2[ti].x]);
}
signed main()
{
	int n,q;
	cin>>n>>q;
	sz=pow(n,2.0/3.0);
	for(int i=1; i<=n; i++)
	{
		cin>>a[i];
		pos[i]=i/sz+1;
	}
	int cnt1=0,cnt2=0;
	for(int i=1; i<=q; i++)
	{
		char op;
		int l,r;
		cin>>op>>l>>r;
		if(op=='Q')
		{
			cnt1++;
			t[cnt1]= {l,r,cnt1,cnt2};
		}
		else
		{
			t2[++cnt2]= {l,r};
		}
	}
	sort(t+1,t+cnt1+1,cmp);
	l=0,r=0;
	int ti=0;
	for(int i=1; i<=cnt1; i++)
	{
		while(l>t[i].l) add(--l);
		while(r<t[i].r) add(++r);
		while(l<t[i].l) del(l++);
		while(r>t[i].r) del(r--);
		while(ti<t[i].ti) change(++ti);
		while(ti>t[i].ti) change(ti--);
		res[t[i].id]=ans;
	}
	for(int i=1; i<=cnt1; i++)
	{
		cout<<res[i]<<"\\n";
	}
}

以上是关于数颜色 / 维护队列(带修莫队板子)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 2120 数颜色 (带修莫队)

bzoj 2453 : 维护队列 带修莫队

2120: 数颜色(带修莫队)

Luogu1903数颜色(带修莫队)

bzoj2120 数颜色——带修莫队

数颜色(带修莫队模板)