【题目描述】求区间中出现项链的种数
【题解】莫队模板题
#include <bits/stdc++.h>
using namespace std;
#define maxn1 50000
#define maxn2 200000
int kk,ans=0;
int n,m;
int tim;
int a[maxn1];int cur[maxn2];int anss[maxn2];
struct Node{
int l,r,id;
friend bool operator < (Node a,Node b)
{
return (a.l/tim) == (b.l/tim) ? a.r<b.r:a.l<b.l;
}
}e[maxn2] ;
void add(int x)
{
if (++cur[a[x]]==1) ++ans;
}
void minu(int x)
{
if (--cur[a[x]]==0) --ans;
}
int main()
{
cin>>n;
int cl=1,cr=0;
for (int i=1;i<=n;i++) cin>>a[i];
cin>>m;
tim=sqrt(m);
for (int i=1;i<=m;i++)
{
cin>>e[i].l;
cin>>e[i].r;
e[i].id=i;
}
// for (int i=1;i<=m;i++)
// {
// cout<<e[i].l<<" "<<e[i].r<<" "<<e[i].id<<endl;
//}
// cout<<tim<<endl;
sort(e+1,e+m+1);
ans=0;
memset(cur,0,sizeof(cur));
for (int i=1;i<=m;i++)
{
int ll=e[i].l;
int rr=e[i].r;
while (cl<ll)
{
minu(cl++);
}
while (cl>ll)
{
add(--cl);
}
while (cr<rr)
{
add(++cr);
}
while (cr>rr)
{
minu(cr--);
}
anss[e[i].id]=ans;
}
for (int i=1;i<=m;i++)
cout<<anss[i]<<endl;
return 0;
}

本文介绍了一道关于区间中出现项链种数的问题,并通过莫队算法进行解答。使用C++实现,包括添加与减去元素的操作,适用于解决区间查询问题。
259

被折叠的 条评论
为什么被折叠?



