# BZOJ1878: [SDOI2009]HH的项链

/**************************************************************
Problem: 1878
User: wang9897
Language: C++
Result: Accepted
Time:3168 ms
Memory:19796 kb
****************************************************************/

#include <bits/stdc++.h>
#define N 50005
using namespace std;
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
}
int a[N];
int rt[N],cnt;
typedef struct node{
int l,r,sum;
}node;
node d[N*30];
void update(int &x,int y,int l,int r,int t,int vul){
++cnt;x=cnt;d[x]=d[y];d[x].sum+=vul;
if(l==r) return ;
int mid=(l+r)>>1;
if(t<=mid) update(d[x].l,d[y].l,l,mid,t,vul);
else update(d[x].r,d[y].r,mid+1,r,t,vul);
}
int ans;
void querty(int x,int l,int r,int l1,int r1){
if(l1<=l&&r<=r1){
ans+=d[x].sum;
return ;
}
int mid=(l+r)>>1;
if(l1<=mid) querty(d[x].l,l,mid,l1,r1);
if(r1>mid) querty(d[x].r,mid+1,r,l1,r1);
}
map<int,int>ma;
int main(){
ios::sync_with_stdio(false);
int n,m;
while(scanf("%d",&n)!=EOF){
cnt=0;
memset(rt,0,sizeof(rt));
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
if(ma[a[i]]==0) update(rt[i],rt[i-1],1,n,i,1);
else{
update(rt[i],rt[i-1],1,n,ma[a[i]],-1);
update(rt[i],rt[i],1,n,i,1);
}
ma[a[i]]=i;
}
scanf("%d",&m);int l,r;
while(m--){
scanf("%d%d",&l,&r);
ans=0;querty(rt[r],1,n,l,r);
printf("%d\n",ans);
}
ma.clear();
}
return 0;
}


树状数组做法

/**************************************************************
Problem: 1878
User: wang9897
Language: C++
Result: Accepted
Time:1124 ms
Memory:5732 kb
****************************************************************/

#include <bits/stdc++.h>
#define N 50005
using namespace std;
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
}
int pre[N],now[N],d[N],a[N];
typedef struct node{
int l,r,biao;
friend bool operator <(node aa,node bb){
return aa.r<bb.r;
}
}node;int n,m;
node dd[200005];
int get_id(int x){
return x&(-x);
}
void update(int x,int t){
for(int i=x;i<=n;i+=get_id(i)){
d[i]+=t;
}
}
int Sum(int x){
int sum=0;
for(int i=x;i>0;i-=get_id(i)){
sum+=d[i];
}
return sum;
}
int ans[200005];
int main(){
ios::sync_with_stdio(false);
map<int,int>ma;
while(scanf("%d",&n)==1){
memset(pre,0,sizeof(pre));
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++){
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
}
sort(dd+1,dd+m+1);int u=1;
for(int i=1;i<=m;i++){
while(u<=dd[i].r){
update(u,1);
if(pre[u]) update(pre[u],-1);
u++;
}
ans[dd[i].biao]=Sum(dd[i].r)-Sum(dd[i].l-1);
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
ma.clear();
}
return 0;
}


## 1878: [SDOI2009]HH的项链

Time Limit: 4 Sec  Memory Limit: 64 MB
Submit: 6848  Solved: 3368
[Submit][Status][Discuss]

## Description

HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运，所以每次散步 完后，他都会随意取出一

## Input

N ≤ 50000，M ≤ 200000。

## Output

M行，每行一个整数，依次表示询问对应的答案。

6
1 2 3 4 3 5
3
1 2
3 5
2 6

2
2
4

## Source

posted @ 2018-08-07 19:37  wang9897  阅读(224)  评论(0编辑  收藏  举报