社区讨论

苍天哪难道主席树不能做这道题目了吗

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 条回复,欢迎继续交流。

正在加载回复...