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 莫队板子