文章
5
粉丝
176
获赞
6
访问
25.9k
可持久化线段树模版题
根据下标建立主席树,每次查询区间中间的数所处的位置,然后区间求和
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
struct node{
int l,r;
int cnt,sum;
}tr[N << 5];
int idx = 0;
vector<int> v;
int a[N];
int root[N];
inline int get(int x){
return lower_bound(v.begin(),v.end(),x) - v.begin() + 1;
}
void insert(int l,int r,int pre,int &now,int val){
tr[++ idx] = tr[pre];
now = idx;
tr[now].cnt ++;
tr[now].sum += v[val - 1];
if(l == r) return ;
int mid = (l + r) >> 1;
if(val <= mid) insert(l,mid,tr[pre].l,tr[now].l,val);
else insert(mid + 1,r,tr[pre].r,tr[now].r,val);
}
int query(int l,int r,int L,int R,int k){
if(l == r) return l;
int mid = (l + r) >> 1;
int tmp = tr[tr[R].l].cnt - tr[tr[L].l].cnt;
&nbs...
登录后发布评论
暂无评论,来抢沙发