记录编号 |
512318 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[SDOI 2009] HH的项链 |
最终得分 |
100 |
用户昵称 |
@@@ |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.840 s |
提交时间 |
2018-10-02 23:46:18 |
内存使用 |
16.71 MiB |
显示代码纯文本
#include<cstdio>
#include<vector>
using namespace std;
class Que
{
public:
int num,val;
};
int n,m;
int num[50001];
int appear[1000001];//最新一次出现
int bit[50001];
vector<Que> query[1000001];//以r为右端点的问题
int ans[200001];
int lowbit(int x)
{
return x&-x;
}
void add(int val,int pos)
{
while(pos<=n)
{
bit[pos]+=val;
pos+=lowbit(pos);
}
return;
}
int sum(int pos)
{
int ret=0;
while(pos>0)
{
ret+=bit[pos];
pos-=lowbit(pos);
}
return ret;
}
int main()
{
freopen("diff.in","r",stdin);
freopen("diff.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int l,r;
scanf("%d%d",&l,&r);
Que Q;
Q.num=i;
Q.val=l;
query[r].push_back(Q);
}
for(int i=1;i<=n;i++)
{
add(1,i);//假设不同,bit[i]中存控制下的不同数
if(appear[num[i]]==0)
{//结果真不同
appear[num[i]]=i;//记下最新位置
}
else
{//假不同
add(-1,appear[num[i]]);//从上一个同处-1
appear[num[i]]=i;
}
for(int j=0;j<query[i].size();j++)
{
ans[query[i][j].num]=sum(i)-sum(query[i][j].val-1);//得到答案
}
}
for(int i=1;i<=m;i++)
{
printf("%d\n",ans[i]);
}
fclose(stdin);
fclose(stdout);
return 0;
}