权值线段树

洛谷P3369【模板】普通平衡树
代码

#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的权值线段树
可持久化的权值线段树(主席树)

洛谷 P3834 【模板】可持久化线段树 2
代码

#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;
} 

Revitalize的主席树

posted @ 2025-07-15 20:37  BIxuan—玉寻  阅读(11)  评论(0)    收藏  举报