洛谷 P2633 Count on a tree 题解
对于每个点建立一颗主席树;
然后按照树上差分的思想统计主席树的前缀和;
lca+主席树+前向星存表就可以了;
#include <bits/stdc++.h>
#define inc(i,a,b) for(register int i=a;i<=b;i++)
#define dec(i,a,b) for(register int i=a;i>=b;i--)
using namespace std;
int head[2000010],cnt;
class littlestar{
public:
int to;
int nxt; }star[2000010];
void add(int u,int v){
star[++cnt].to=v;
star[cnt].nxt=head[u];
head[u]=cnt;
}
int n,m;
template<class nT>
inline void read(nT& x)
{
char c;
while(c=getchar(),!isdigit(c));
x=c^48;
while(c=getchar(),isdigit(c)) x=x*10+c-48;
}
int a[2000010],val[2000010];
int dep[2000010],f[1000010][30];
void pre(int u,int fa)
{
//printf("%d %d\n",u,fa);
dep[u]=dep[fa]+1;
inc(i,0,20){
f[u][i+1]=f[f[u][i]][i];
}
for(register int i=head[u];i;i=star[i].nxt){
int v=star[i].to;
if(v==fa) continue;
f[v][0]=u;
pre(v,u);
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
dec(i,19,0){
if(dep[f[x][i]]>=dep[y]) x=f[x][i];
if(x==y) return x;
}
dec(i,19,0){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int rt[20000010];
int num=0;
class node2{
public:
int l;
int r;
int w;
}tree[20000010];
void insert(int preroot,int &root,int l,int r,int goal){
tree[root=++num]=tree[preroot];
tree[root].w++;
if(l==r) return;
int mid=(l+r)>>1;
if(goal<=mid){
insert(tree[preroot].l,tree[root].l,l,mid,goal);
}
else{
insert(tree[preroot].r,tree[root].r,mid+1,r,goal);
}
tree[root].w=(tree[tree[root].l].w+tree[tree[root].r].w);
}
int query(int l,int r,int x,int y,int lc,int falc,int k){
if(l==r) return l;
int tmp=tree[tree[x].l].w+tree[tree[y].l].w-tree[tree[lc].l].w-tree[tree[falc].l].w;
int mid=(l+r)>>1;
if(k<=tmp){
return query(l,mid,tree[x].l,tree[y].l,tree[lc].l,tree[falc].l,k);
}
else{
return query(mid+1,r,tree[x].r,tree[y].r,tree[lc].r,tree[falc].r,k-tmp);
}
}
void dfs(int u)
{
insert(rt[f[u][0]],rt[u],1,n,val[u]);
for(register int i=head[u];i;i=star[i].nxt){
int v=star[i].to;
if(v==f[u][0]) continue;
dfs(v);
}
}
int ago[2000010];
signed main()
{
//freopen("ha.in","r",stdin);
read(n); read(m);
inc(i,1,n) read(a[i]),val[i]=a[i];
inc(i,1,n-1){
int u,v;
read(u); read(v);
add(u,v);
add(v,u);
}
sort(a+1,a+1+n);
int lisan=unique(a+1,a+1+n)-a-1;
inc(i,1,n){
int tmp=val[i];
val[i]=lower_bound(a+1,a+1+lisan,val[i])-a;
ago[val[i]]=tmp;
}
pre(1,0);
dfs(1);
int onlineans=0;
inc(i,1,m){
int u,v,k;
read(u);read(v);read(k);
u^=onlineans;
int LCA=lca(u,v);
int last=query(1,n,rt[u],rt[v],rt[LCA],rt[f[LCA][0]],k);
onlineans=ago[last];
printf("%d\n",onlineans);
}
}
洛谷 P2633 Count on a tree 题解的更多相关文章
- 洛谷 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(主席树上树)
题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...
- 洛谷P2633 Count on a tree(主席树,倍增LCA)
洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...
- 洛谷P2633 Count on a tree(主席树,倍增LCA,树上差分)
洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...
- 洛谷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 「树上主席树」
题目类型:主席树+\(LCA\) 传送门:>Here< 题意:给出一棵树.每个节点有点权.问某一条路径上排名第\(K\)小的点权是多少 解题思路 类似区间第\(K\)小,但放在了树上. 考 ...
- 洛谷P2633 Count on a tree 主席树
传送门:主席树 解题报告: 传送门! umm这题我还麻油开始做 所以 先瞎扯一波我的想法,如果错了我就当反面教材解释这种典型错误,对了我就不管了QwQ 就直接dfs,在dfs的过程中建树 然后就直接查 ...
- 洛谷 P6177 - Count on a tree II/【模板】树分块(树分块)
洛谷题面传送门 好家伙,在做这道题之前我甚至不知道有个东西叫树分块 树分块,说白了就是像对序列分块一样设一个阈值 \(B\),然后在树上随机撒 \(\dfrac{n}{B}\) 个关键点,满足任意一个 ...
随机推荐
- AtCoder AGC004F Namori (图论)
题目链接 https://atcoder.jp/contests/agc004/tasks/agc004_f 题解 神仙题.. 首先考虑树的情况,树是二分图,因此假设我们对二分图进行黑白染色,那么操作 ...
- 免费馅饼~-~ (hdu 1176
当我准备要写这个随笔的时候是需要勇气的. 掉馅饼嘛,肯定是坑. (hdu1176 话说,gameboy人品太好,放学回家路上有馅饼可捡.还就在0~10这11个位置里,当馅饼开始掉的时候,gameboy ...
- spark-sql cli 参数 及使用
很难找到spark-sql cli使用的教程,总结下一.启动方法/data/spark-1.4.0-bin-cdh4/bin/spark-sql --master spark://master:707 ...
- HAOI2010软件安装
首先tarjan缩点应该能看出来,然后我用topsort跑了个DAG上的一维dp,结果WA的很惨. 其实用DAG应该也能做,但是DAG强调整体顺序,而对一些局部问题,例如两个儿子怎么分配,是否给当前节 ...
- light4j轻量级微服务应用
最近对light-4j轻框架比较感兴趣,于是对现有应用做了一次重构,现将其间的一些点滴所得分享出来. 项目打包 pom.xml配置了两个profile:debug支持mvn exec:exec启动应用 ...
- LeetCode 48. 旋转图像(Rotate Image)
题目描述 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 1: ...
- 尚学堂requireJs课程---1、作用域回顾
尚学堂requireJs课程---1.作用域回顾 一.总结 一句话总结: 尚学堂的课程的资料他的官网上面是有的 1.js作用域? ~ js中是函数作用域:局部变量的话要写var关键词 ~ 闭包可以解决 ...
- python全栈开发第7天 nginx服务器和nfs的搭建及组成集群的方法
作业一:nginx服务 二进制安装nginx包 1.使用命令:yum install epel-release -y ,来安装epel,安装成功如下图:(因为我用32位的centos7老是出现各种各样 ...
- Linux版本
1.内核:Linux内核Kernel目前最新稳定版 3.4 http://www.kernel.org/ 2.发行版本:是一些厂商将Linux系统内核与应用软件和文档包装起来,并提供一些安装界面和系 ...
- 利用ExpandableListView实现常用号码查询功能的实现
package com.loaderman.expandablelistviewdemo; import android.content.Context; import android.databas ...