Machine Learning(带修莫队)

Posted thusloop

tags:

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

Machine Learning
区间出现次数的mex
用桶暴力求mex

#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=5e5+100;
int a[maxn],cnt[maxn],c[maxn];
int ans[maxn],pos[maxn];
map<int,int>mp;
int sz;
int l,r;
int res=1;
struct node
{
	int l,r;
	int id;
	int ti;
} t1[maxn];
struct node2
{
	int p,w;
} 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)
{
	if(cnt[c[x]]==1)
	{
		res=min(res,c[x]);
	}
	cnt[c[x]]--;
	c[x]++;
	cnt[c[x]]++;
	while(cnt[res]) res++;
}
void del(int x)
{
	if(cnt[c[x]]==1)
	{
		res=min(res,c[x]);
	}
	cnt[c[x]]--;
	c[x]--;
	cnt[c[x]]++;
	while(cnt[res]) res++;
}
void change(int x)
{
	if(l<=t2[x].p&&t2[x].p<=r)
	{
		del(a[t2[x].p]);
		add(t2[x].w);
	}
	swap(a[t2[x].p],t2[x].w);
}
signed main()
{
	IOS
	int n,q;
	cin>>n>>q;
	sz=pow(n,2.0/3.0);
	for(int i=1; i<=n; i++)
	{
		cin>>a[i];
		mp[a[i]]=1;
		pos[i]=i/sz+1;
	}
	int cnum=0,qnum=0;
	for(int i=1; i<=q; i++)
	{
		int op,l,r;
		cin>>op>>l>>r;
		if(op==1)
		{
			++qnum;
			t1[qnum]= {l,r,qnum,cnum};
		}
		else
		{
			++cnum;
			mp[r]=1;
			t2[cnum]= {l,r};
		}
	}
	int mx=0;
	for(auto it:mp)
	{
		mp[it.fi]=++mx;
	}
	for(int i=1; i<=n; i++) a[i]=mp[a[i]];
	for(int i=1; i<=cnum; i++) t2[i].w=mp[t2[i].w];
	sort(t1+1,t1+qnum+1,cmp);
	l=1;
	r=0;
	int ti=0;
	for(int i=1; i<=qnum; i++)
	{
		while(l>t1[i].l) add(a[--l]);
		while(r<t1[i].r) add(a[++r]);
		while(l<t1[i].l) del(a[l++]);
		while(r>t1[i].r) del(a[r--]);
		while(ti<t1[i].ti) change(++ti);
		while(ti>t1[i].ti) change(ti--);
		//res=1;
		//while(cnt[res])res++;
		ans[t1[i].id]=res;
	}
	for(int i=1; i<=qnum; i++)
	{
		cout<<ans[i]<<"\\n";
	}
}


以上是关于Machine Learning(带修莫队)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #466 (Div. 2) F. Machine Learning 莫队+分块 带修莫队的模板题

题解CF940F Machine Learning

F. Machine Learning 带修端点莫队

bzoj 2120 数颜色 (带修莫队)

Luogu1903数颜色(带修莫队)

带修莫队