【BZOJ2588】【Spoj10628】—Count on a tree(主席树)

传送门

题意:求树上路径第 k k k大值


主席树菜题

树上主席树就完了

#include<bits/stdc++.h>
using namespace std;
const int RLEN=1<<21|1;
inline char gc(){
	static char ibuf[RLEN],*ib,*ob;
	(ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
	return (ob==ib)?EOF:*ib++;
}
inline int read(){
	char ch=gc();
	int res=0,f=1;
	while(!isdigit(ch))f^=ch=='-',ch=gc();
	while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
	return f?res:-res;
}
const int N=100005;
namespace Ptree{
	#define mid ((l+r)>>1)
	int rt[N],lc[N*22],rc[N*22],sum[N*22],tot;
	void insert(int &u,int r1,int l,int r,int k){
		u=++tot,lc[u]=lc[r1],rc[u]=rc[r1],sum[u]=sum[r1]+1;
		if(l==r)return;
		if(k<=mid)insert(lc[u],lc[r1],l,mid,k);
		else insert(rc[u],rc[r1],mid+1,r,k);
	}
	int query(int r1,int r2,int r3,int r4,int l,int r,int k){
		if(l==r)return l;
		int num=sum[lc[r4]]+sum[lc[r3]]-sum[lc[r1]]-sum[lc[r2]];
		if(k<=num)return query(lc[r1],lc[r2],lc[r3],lc[r4],l,mid,k);
		else return query(rc[r1],rc[r2],rc[r3],rc[r4],mid+1,r,k-num);
	}
}
using namespace Ptree;
int adj[N],nxt[N<<1],to[N<<1],val[N],a[N],cnt,n,m,top[N],dep[N],siz[N],son[N],fa[N],last;
void dfs1(int u){
	siz[u]=1;insert(rt[u],rt[fa[u]],1,cnt,val[u]);
	for(int e=adj[u];e;e=nxt[e]){
		int v=to[e];
		if(v==fa[u])continue;
		fa[v]=u,dep[v]=dep[u]+1;
		dfs1(v),siz[u]+=siz[v];
		if(siz[v]>siz[son[u]])son[u]=v;
	}
}
void dfs2(int u,int tp){
	top[u]=tp;
	if(son[u])dfs2(son[u],tp);
	for(int e=adj[u];e;e=nxt[e]){
		int v=to[e];
		if(v==fa[u]||v==son[u])continue;
		dfs2(v,v);
	}
}
inline int Lca(int u,int v){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		u=fa[top[u]];
	}
	return dep[u]>dep[v]?v:u;
}
inline void addedge(int u,int v){
	nxt[++cnt]=adj[u],adj[u]=cnt,to[cnt]=v;
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)val[i]=a[i]=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		addedge(u,v),addedge(v,u);
	}
	cnt=0;
	sort(a+1,a+n+1);
	cnt=unique(a+1,a+n+1)-a-1;
	for(int i=1;i<=n;i++)val[i]=lower_bound(a+1,a+cnt+1,val[i])-a;
	dfs1(1),dfs2(1,1);
	while(m--){
		int u=read()^last,v=read(),k=read();
		int lca=Lca(u,v);
		cout<<(last=a[query(rt[fa[lca]],rt[lca],rt[u],rt[v],1,cnt,k)])<<'\n';
	}
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值