Different Integers(莫队板子)

Posted thusloop

tags:

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

Different Integers
题意:求区间 1-i 和j-n的不同数的数量。

#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
//#define int long long
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf=2e18+100;
const int maxn=2e5+100;
int a[maxn],pos[maxn];
int ans[maxn],cnt[maxn],sum;
struct node
{
	int l,r;
	int id;
} t[maxn];
bool cmp(node a,node b)
{
	if(pos[a.l]==pos[b.l])return a.r<b.r;
	return pos[a.l]<pos[b.l];
}
void add(int x)
{
	cnt[x]++;
	if(cnt[x]==1)sum++;
}
void del(int x)
{
	cnt[x]--;
	if(cnt[x]==0)sum--;
}
signed main()
{
	//IOS
	int n,q;
	while(scanf("%d %d",&n,&q)!=EOF)
	{
		sum=0;
		int sz=sqrt(n);
		memset(cnt,0,sizeof(int)*(n+10));
		for(int i=1; i<=n; i++)
		{
			cin>>a[i];
			pos[i]=i/sz;
		}
		for(int i=1; i<=q; i++)
		{
			scanf("%d %d",&t[i].l,&t[i].r);
			t[i].id=i;
		}
		sort(t+1,t+q+1,cmp);
		int l=0,r=n+1;
		for(int i=1; i<=q; i++)
		{
			while(l<t[i].l)add(a[++l]);
			while(r>t[i].r)add(a[--r]);
			while(l>t[i].l)del(a[l--]);
			while(r<t[i].r)del(a[r++]);
			ans[t[i].id]=sum;
		}
		for(int i=1; i<=q; i++)
		{
			printf("%d\\n",ans[i]);
		}
	}
}

以上是关于Different Integers(莫队板子)的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode, not perfect] 992. Subarrays with K Different Integers

莫队板子

带修莫队板子

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

A Simple Problem with Integers POJ - 3468 区间更新,区间查询板子

Codeforces Round #340 (Div. 2) E XOR and Favorite Number 莫队板子