社区讨论
苍天哪难道主席树不能做这道题目了吗
P1972[SDOI2009] HH 的项链参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lo1rltmb
- 此快照首次捕获于
- 2023/10/23 01:50 2 年前
- 此快照最后确认于
- 2023/11/03 02:28 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
#define ri register int
#define ll int
const int N=1e6+5;
ll a[N],n,m;
ll hea[N],nex[N];
ll rt[N],ls[N<<5],rs[N<<5],sum[N<<5],cnt=0;
void insert(ll &p,ll pre,ll l,ll r,ll x){
p=++cnt;ls[p]=ls[pre];rs[p]=rs[pre];sum[p]=sum[pre]+1;
if(l==r) return;
ll mid=l+r>>1;
if(x<=mid) insert(ls[p],ls[pre],l,mid,x);
else insert(rs[p],rs[pre],mid+1,r,x);
}
ll query(ll now,ll pre,ll l,ll r,ll x){
if(l==r&&l<=x) return sum[now]-sum[pre];//找到答案
if(l==r) return 0;
ll mid=l+r>>1;
ll v=sum[ls[now]]-sum[ls[pre]];
if(x<=mid) return query(ls[now],ls[pre],l,mid,x);
else return query(rs[now],rs[pre],mid+1,r,x)+v;
}
int main(){
std::ios::sync_with_stdio(false);
cin>>n;
for(ri i=1;i<=n;i++){
cin>>a[i];
}
for(ri i=1;i<=n;i++){
nex[i]=hea[a[i]];
hea[a[i]]=i;
}
for(ri i=1;i<=n;i++){
insert(rt[i],rt[i-1],0,n,nex[i]);
}
cin>>m;
while(m--){
ll l,r;
cin>>l>>r;
cout<<query(rt[r],rt[l-1],0,n,l-1)<<endl;
}
}
求优化,最近练主席树,虽然离线水过去了
回复
共 5 条回复,欢迎继续交流。
正在加载回复...