洛谷P2633 Count on a tree 主席树
传送门:主席树
解题报告:
就非常板子昂$QwQ$
直接dfs,在dfs的过程中建树
然后就直接查询就好
其实我jio得就是个主席树板子题套在树上,,,?
然后具体处理也不难想?就考虑树上差分,形式大概就是tr[r]+tr[l]-tr[lca]-tr[lca.fa]
然后其他做法就都和主席树的板子一样辣辣辣!
快乐地发现有个双倍经验嘻嘻
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define fr first
#define sc second
#define rg register
#define gc getchar()
#define mp make_pair
#define t(i) edge[i].to
#define rp(i,x,y) for(rg int i=x;i<=y;++i)
#define my(i,x,y) for(rg int i=x;i>=y;--i)
#define e(i,x) for(rg int i=head[x];i;i=edge[i].nxt) const int N=+;
int n,m,a[N],st[N],rt[N],cnt,n_lsh,head[N],ed_cnt,as,fa[N][],dep[N],poww[]={};
struct node{int ls,rs,l,r,val;}tr[N*];
struct ed{int to,nxt;}edge[N<<]; il int read()
{
rg char ch=gc;rg int x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(int x,int y){edge[++ed_cnt]=(ed){x,head[y]};head[y]=ed_cnt;}
il void build(int x,int l,int r)
{
++cnt;tr[x].l=l,tr[x].r=r;if(l==r)return;
int mid=(l+r)>>;tr[x].ls=cnt+;build(tr[x].ls,l,mid);tr[x].rs=cnt+;build(tr[x].rs,mid+,r);return;
}
il void updat(int x,int dat)
{
++cnt;tr[cnt]=tr[x];++tr[cnt].val;if(tr[cnt].l==tr[cnt].r)return;
int mid=(tr[cnt].l+tr[cnt].r)>>;
if(dat<=mid){tr[cnt].ls=cnt+;updat(tr[x].ls,dat);}else{tr[cnt].rs=cnt+;updat(tr[x].rs,dat);}
}
il int query(int x,int xx,int x1,int x2,int dat)
{
if(tr[x1].l==tr[x1].r)return tr[x1].l;int ret=tr[tr[x2].ls].val+tr[tr[x1].ls].val-tr[tr[x].ls].val-tr[tr[xx].ls].val;
if(ret<dat)return query(tr[x].rs,tr[xx].rs,tr[x1].rs,tr[x2].rs,dat-ret);return query(tr[x].ls,tr[xx].ls,tr[x1].ls,tr[x2].ls,dat);
}
il void dfs(int x,int fat){fa[x][]=fat;dep[x]=dep[fat]+;rp(i,,)fa[x][i]=fa[fa[x][i-]][i-];e(i,x)if(t(i)^fat)rt[t(i)]=cnt+,updat(rt[x],a[t(i)]),dfs(t(i),x);}
il int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
my(i,,)if(dep[fa[x][i]]>=dep[y])x=fa[x][i];if(x==y)return x;
my(i,,)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][];
} int main()
{
n=read();m=read();rp(i,,n)a[i]=st[i]=read();sort(st+,st++n);n_lsh=unique(st+,st++n)-st-;rp(i,,n)a[i]=lower_bound(st+,st+n_lsh+,a[i])-st;
rt[]=;build(,,n_lsh);rt[]=cnt+;updat(,a[]);
rp(i,,n-){int x=read(),y=read();ad(x,y);ad(y,x);}dfs(,);
rp(i,,)poww[i]=poww[i-]<<;
rp(i,,m){int l=read()^as,r=read(),x=read(),lcaa=lca(l,r);printf("%d\n",as=st[query(rt[fa[lcaa][]],rt[lcaa],rt[l],rt[r],x)]);}
return ;
}
放下代码就好辣!
洛谷P2633 Count on a tree 主席树的更多相关文章
- 洛谷P2633 Count on a tree(主席树上树)
题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...
- 洛谷 P2633 Count on a tree 主席树
在一棵树上,我们要求点 $(u,v)$ 之间路径的第$k$大数. 对于点 $i$ ,建立 $i$ 到根节点的一棵前缀主席树. 简单容斥后不难得出结果为$sumv[u]+sumv[v]−sumv[l ...
- 洛谷 P2633 Count on a tree
P2633 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中last ...
- 洛谷P2633 Count on a tree(主席树,倍增LCA)
洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...
- 洛谷P2633 Count on a tree(主席树,倍增LCA,树上差分)
洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...
- ☆ [洛谷P2633] Count on a tree 「树上主席树」
题目类型:主席树+\(LCA\) 传送门:>Here< 题意:给出一棵树.每个节点有点权.问某一条路径上排名第\(K\)小的点权是多少 解题思路 类似区间第\(K\)小,但放在了树上. 考 ...
- 洛谷P2633 Count on a tree
题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...
- 洛谷 P2633 Count on a tree 题解
题面 对于每个点建立一颗主席树: 然后按照树上差分的思想统计主席树的前缀和: lca+主席树+前向星存表就可以了: #include <bits/stdc++.h> #define inc ...
- P2633 Count on a tree(主席树)
题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...
随机推荐
- (转)Windows系统白名单以及UAC机制
用户帐户控制 深入了解 Windows 7 用户帐户控制 Mark Russinovich 概览: 标准用户帐户 用户帐户控制 内容 UAC 技术 提升与恶意软件安全性 Windows 7 中的不 ...
- .net core实现跨域
什么是跨域在前面已经讲解过了,这里便不再讲解,直接上代码. 一.后台API接口 用.net core创建一个Web API项目负责给前端界面提供数据. 二.前端界面 建立两个MVC项目,模拟不同的ip ...
- Go指南练习_rot13Reader
https://tour.go-zh.org/methods/23 一.题目描述 有种常见的模式是一个 io.Reader 包装另一个 io.Reader,然后通过某种方式修改其数据流. 例如,gzi ...
- sqllocaldb 2016安装
msiexec /i SqlLocalDB.msi /qn IACCEPTSQLLOCALDBLICENSETERMS=YES
- nginx 配置信息
主配置文件: cat /etc/nginx/nginx.conf# For more information on configuration, see:# * Official English Do ...
- java.security.ProviderException: java.security.KeyException
本机部署没问题,部署到linux服务器报错: javax.net.ssl.SSLException: java.security.ProviderException: java.security.Ke ...
- 【代码审计】大米CMS_V5.5.3 后台多处存储型XSS漏洞分析
0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...
- 精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解
原文:Chalarangelo 译文:IT168 https://github.com/Chalarangelo/30-seconds-of-code#anagrams-of-string-with ...
- 23种设计模式之原型模式(Prototype)
在系统开发过程中,有时候有些对象需要被频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后通过复制这个原型对象的办法,创建出更多同类型的对象.原型模式是一种对象创建型模式,用原型实例 ...
- jQuery学习之二
jQuery对象获取方法:var $cr=$("#cr"); //jQuery方法获取的是一个·对象数组. var cr=$cr[0] // var cr=$cr.get(0); ...