社区讨论
主席树全WA求助
P3834【模板】可持久化线段树 2参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo1s2sax
- 此快照首次捕获于
- 2023/10/23 02:04 2 年前
- 此快照最后确认于
- 2023/11/03 02:41 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll int
#define ri register int
const int N=2e5+5;
ll n,m,a[N],b[N],rt[N];
ll sum[N<<5],ls[N<<5],rs[N<<5],cnt=0;
void bt(ll &p,ll l,ll r){
p=++cnt;
sum[p]=0;
if(l==r) return;
ll mid=l+r>>1;
bt(ls[p],l,mid);
bt(rs[p],mid+1,r);
}
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],pre,l,mid,x);
else insert(rs[p],pre,mid+1,r,x);
}
ll query(ll u,ll v,ll l,ll r,ll k){
if(l==r) return l;//找到目标位置
ll x=sum[ls[v]]-sum[ls[u]],mid=l+r>>1;
if(x>=k) return query(ls[u],ls[v],l,mid,k);//左子树比k大,答案在左子树
else return query(rs[u],rs[v],mid+1,r,k-x);//否则在右子树,减去左子树的排名
}
int main(){
std::ios::sync_with_stdio(false);
cin>>n>>m;
for(ri i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
ll len=unique(b+1,b+n+1)-b-1;
bt(rt[0],1,len);
for(ri i=1;i<=n;i++){
ll t=lower_bound(b+1,b+len+1,a[i])-b;
insert(rt[i],rt[i-1],1,len,t);
}
while(m--){
ll l,r,k;
cin>>l>>r>>k;
ll t=query(rt[l-1],rt[r],1,len,k);
cout<<b[t]<<endl;
}
}
https://www.luogu.com.cn/record/121756190
回复
共 1 条回复,欢迎继续交流。
正在加载回复...