权值线段树
#include<bits/stdc++.h>
using namespace std;
#define ls (pos<<1)
#define rs (pos<<1|1)
struct jade
{
int l,r,num;
}t[400010];
struct deek
{
int v,op;
}a[100010];
int n,tot;
int b[100010];
void pushup(int pos)
{
t[pos].num=t[ls].num+t[rs].num;
}
void build(int pos,int l,int r)
{
t[pos].l=l;
t[pos].r=r;
if(l==r)
{
return ;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
}
void add(int pos,int x,int v)
{
if(t[pos].l==x&&t[pos].l==t[pos].r)
{
t[pos].num+=v;
t[pos].num=max(t[pos].num,0);
return ;
}
int mid=(t[pos].l+t[pos].r)>>1;
if(x<=mid)
{
add(ls,x,v);
}
else
{
add(rs,x,v);
}
pushup(pos);
}
int find(int pos,int l,int r)
{
if(l<=t[pos].l&&t[pos].r<=r)
{
return t[pos].num;
}
int res=0;
int mid=(t[pos].l+t[pos].r)>>1;
if(l<=mid)
{
res+=find(ls,l,r);
}
if(r>mid)
{
res+=find(rs,l,r);
}
return res;
}
int kth(int pos,int k)
{
if(t[pos].l==t[pos].r)
{
return t[pos].l;
}
if(k<=t[ls].num)
{
return kth(ls,k);
}
else
{
return kth(rs,k-t[ls].num);
}
}
int qq(int pos,int x)
{
if(t[pos].l==t[pos].r)
{
if(t[pos].l<x&&t[pos].num!=0)
{
return t[pos].l;
}
else
{
return 0;
}
}
int res=0;
int mid=(t[pos].l+t[pos].r)>>1;
if(x>mid+1&&t[ls].num!=0)
{
res=qq(rs,x);
}
if(res!=0)
{
return res;
}
return qq(ls,x);
}
int hj(int pos,int x)
{
if(t[pos].l==t[pos].r)
{
if(t[pos].l>x&&t[pos].num!=0)
{
return t[pos].l;
}
else
{
return 0;
}
}
int res=0;
int mid=(t[pos].l+t[pos].r)>>1;
if(mid>x&&t[ls].num!=0)
{
res=hj(ls,x);
}
if(res!=0)
{
return res;
}
return hj(rs,x);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].op>>a[i].v;
if(a[i].op!=4)
{
tot++;
b[tot]=a[i].v;
}
}
sort(b+1,b+tot+1);
tot=unique(b+1,b+tot+1)-b-1;
build(1,1,tot);
for(int i=1;i<=n;i++)
{
if(a[i].op!=4)
{
a[i].v=lower_bound(b+1,b+tot+1,a[i].v)-b;
}
if(a[i].op==1)
{
add(1,a[i].v,1);
}
if(a[i].op==2)
{
add(1,a[i].v,-1);
}
if(a[i].op==3)
{
cout<<find(1,1,a[i].v-1)+1<<endl;
}
if(a[i].op==4)
{
cout<<b[kth(1,a[i].v)]<<endl;
}
if(a[i].op==5)
{
int rk=find(1,1,a[i].v-1);
cout<<b[kth(1,rk)]<<endl;
}
if(a[i].op==6)
{
int rk=find(1,1,a[i].v)+1;
cout<<b[kth(1,rk)]<<endl;
}
}
return 0;
}
BFqwq的权值线段树
Seaway-Fu的权值线段树
可持久化的权值线段树(主席树)
#include<bits/stdc++.h>
using namespace std;
int a[200010],rt[200010],b[200010];
struct jade
{
int l,r,lc,rc,v,tag;
}t[8000000];
struct seek
{
int p,v;
}val[200010];
int id,vall,goal,loc,tot,n,m;
bool cmp(seek x,seek y)
{
return x.v<y.v;
}
void init(int pos)
{
id++;
t[id]=t[pos];
}
void build(int ro,int l,int r)
{
id++;
t[id].l=l;
t[id].r=r;
if(t[ro].lc==0)
{
t[ro].lc=id;
}
else
{
t[ro].rc=id;
}
if(l==r)
{
t[id].v=a[l];
return ;
}
int mid=(l+r)>>1;
int x=id;
build(x,l,mid);
build(x,mid+1,r);
t[x].v=t[t[x].lc].v+t[t[x].rc].v;
}
void add(int pos)
{
if(t[pos].l==t[pos].r)
{
init(pos);
t[id].v+=vall;
return ;
}
int mid=(t[pos].l+t[pos].r)>>1;
if(goal<=mid)
{
add(t[pos].lc);
init(pos);
t[id].lc=id-1;
}
if(goal>mid)
{
add(t[pos].rc);
init(pos);
t[id].rc=id-1;
}
t[id].v=t[t[id].lc].v+t[t[id].rc].v;
if(pos==rt[loc])
{
tot++;
rt[tot]=id;
}
}
int find(int pos,int x)
{
if(t[pos].l==t[pos].r)
{
return t[pos].l;
}
int k=t[t[x].lc].v-t[t[pos].lc].v;
if(k>=vall)
{
return find(t[pos].lc,t[x].lc);
}
else
{
vall-=k;
return find(t[pos].rc,t[x].rc);
}
}
void lsh()
{
sort(val+1,val+1+n,cmp);
for(int i=1;i<=n;i++)
{
a[val[i].p]=i;
b[i]=val[i].v;
}
}
void build_p()
{
for(int i=0;i<n;i++)
{
goal=a[i+1];
vall=1;
loc=i;
add(rt[i]);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>val[i].v;
val[i].p=i;
}
lsh();
tot=0;
rt[0]=1;
build(0,1,n);
build_p();
for(int i=1;i<=m;i++)
{
int l,r;
cin>>l>>r>>vall;
cout<<b[find(rt[l-1],rt[r])]<<endl;
}
return 0;
}
以下是签名
${\scr {jade }}$ ${\scr {seek }}$
本文来自博客园,作者:BIxuan—玉寻,转载请注明原文链接:https://www.cnblogs.com/zhangyuxun100219/p/18986316

浙公网安备 33010602011771号