您的位置:首页 > 其它

BZOJ 1878 [SDOI2009]HH的项链

2016-10-13 22:41 429 查看
Description

HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此, 他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同 的贝壳?这个问题很难回答。。。因为项链实在是太长了。于是,他只好求助睿智的你,来解 决这个问题。

【题目分析】

树状数组

【代码】

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int a[50005];
int next[50005];
int last[1000005];
int t[50005];
int l[200005],r[200005],rank[200005],ans[200005];
int n,m;
inline bool cmp(int a,int b)
{return l[a]<l[b];}
inline void add(int x,int f)
{for (int i=x;i<=n;i+=i&(-i)) t[i]+=f;}
inline int gs(int k)
{
int ret=0;
for (int i=k;i;i-=i&(-i)) ret+=t[i];
return ret;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;++i)
{
scanf("%d",&a[i]); a[i]++;
if (!last[a[i]]) add(i,1);
else next[last[a[i]]]=i;
last[a[i]]=i;
}
scanf("%d",&m);
for (int i=1;i<=m;++i)
{
scanf("%d%d",&l[i],&r[i]);
rank[i]=i;
}
sort(rank+1,rank+m+1,cmp);
int ll=1;
for (int i=1;i<=m;++i)
{
int nl=l[rank[i]],nr=r[rank[i]];
while (ll<nl)
{
if (next[ll]) add(next[ll],1);
ll++;
}
ans[rank[i]]=gs(nr)-gs(nl-1);
}
for (int i=1;i<=m;++i) printf("%d\n",ans[i]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: