Count on a tree(bzoj 2588)
Description
Input
Output
M行,表示每个询问的答案。最后一个询问不输出换行符
Sample Input
105 2 9 3 8 5 7 7
1 2
1 3
1 4
3 5
3 6
3 7
4 8
2 5 1
0 5 2
10 5 3
11 5 4
110 8 2
Sample Output
8
9
105
7
/*
树上第K大
对于每一个节点,维护一棵权值线段树,记录它到根节点的状态,询问的时候,类似于区间第K大,这条链上的
总数就是sum[a]+sum[b]-sum[lca]-sum[fa[lca]]
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 200010
using namespace std;
int a[N],b[N],val[N],n,m,len;
int head[N],fa[N][],dep[N],root[N],lc[N*],rc[N*],sum[N*],cnt;
struct node{int v,pre;}e[N*];
void add(int i,int u,int v){
e[i].v=v;
e[i].pre=head[u];
head[u]=i;
}
void pushup(int now){
sum[now]=sum[lc[now]]+sum[rc[now]];
}
void change(int last,int &now,int x,int l,int r){
now=++cnt;
if(l==r){
sum[now]=sum[last]+;
return;
}
int mid=l+r>>;
if(x<=mid) change(lc[last],lc[now],x,l,mid),rc[now]=rc[last];
else change(rc[last],rc[now],x,mid+,r),lc[now]=lc[last];
pushup(now);
}
void dfs(int x,int f,int c){
dep[x]=c;fa[x][]=f;change(root[f],root[x],a[x],,len);
for(int i=head[x];i;i=e[i].pre){
if(e[i].v==f) continue;
dfs(e[i].v,x,c+);
}
}
void get_fa(){
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
fa[i][j]=fa[fa[i][j-]][j-];
}
int get_same(int u,int t){
for(int i=;i<=;i++)
if(t&(<<i))
u=fa[u][i];
return u;
}
int LCA(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
u=get_same(u,dep[u]-dep[v]);
if(u==v) return u;
for(int i=;i>=;i--)
if(fa[u][i]!=fa[v][i])
u=fa[u][i],v=fa[v][i];
return fa[u][];
}
int query(int a,int b,int A,int B,int k,int l,int r){
int x=sum[lc[a]]+sum[lc[b]]-sum[lc[A]]-sum[lc[B]];
if(l==r) return l;
int mid=l+r>>;
if(k<=x) return query(lc[a],lc[b],lc[A],lc[B],k,l,mid);
else return query(rc[a],rc[b],rc[A],rc[B],k-x,mid+,r);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+,b+n+);
len=unique(b+,b+n+)-b-;
for(int i=;i<=n;i++){
int t=lower_bound(b+,b+len+,a[i])-b;
val[t]=a[i];a[i]=t;
}
for(int i=;i<n;i++){
int u,v;scanf("%d%d",&u,&v);
add(i*-,u,v);add(i*,v,u);
}
dfs(,,);get_fa();
int ans=;
for(int i=;i<=m;i++){
int u,v,k;scanf("%d%d%d",&u,&v,&k);u^=ans;
int anc=LCA(u,v);
ans=val[query(root[u],root[v],root[anc],root[fa[anc][]],k,,len)];
printf("%d",ans);
if(i!=m) printf("\n");
}
return ;
}
Count on a tree(bzoj 2588)的更多相关文章
- 【BZOJ2588】Count On a Tree(主席树)
[BZOJ2588]Count On a Tree(主席树) 题面 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第 ...
- bzoj 2588 Spoj 10628. Count on a tree(主席树)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- hdu 4670 Cube number on a tree(点分治)
Cube number on a tree Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/ ...
- 04-树6 Complete Binary Search Tree(30 分)
title: 04-树6 Complete Binary Search Tree(30 分) date: 2017-11-12 14:20:46 tags: - 完全二叉树 - 二叉搜索树 categ ...
- P3690 【模板】Link Cut Tree (动态树)
P3690 [模板]Link Cut Tree (动态树) 认父不认子的lct 注意:不 要 把 $fa[x]$和$nrt(x)$ 混 在 一 起 ! #include<cstdio> v ...
- 1127 ZigZagging on a Tree (30 分)
1127 ZigZagging on a Tree (30 分) Suppose that all the keys in a binary tree are distinct positive in ...
- 【PAT】1043 Is It a Binary Search Tree(25 分)
1043 Is It a Binary Search Tree(25 分) A Binary Search Tree (BST) is recursively defined as a binary ...
- 1110 Complete Binary Tree (25 分)
1110 Complete Binary Tree (25 分) Given a tree, you are supposed to tell if it is a complete binary t ...
- 【POJ1741】Tree(点分治)
[POJ1741]Tree(点分治) 题面 Vjudge 题目大意: 求树中距离小于\(K\)的点对的数量 题解 完全不觉得点分治了.. 简直\(GG\),更别说动态点分治了... 于是来复习一下. ...
随机推荐
- 00_HTTP协议介绍
1. 什么是HTTP协议 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到 ...
- python 基础网络编程1
python 基础网络编程1 Source code: Lib/socketserver.py lib的主目录下有一个sockserver.py文件, 里面是python基本的网络编程模型 共有一个b ...
- dubbo 分布式治理
1. dubbo 仅支持java语言之间的通讯. 2. dubbo 产生的背景是因为分布式的情况下产生的. 3. 解决服务治理的问题,通过注册中心进行管理 4.SOA 治理方案 tcp 协议传输,只需 ...
- 2018_oakland_linuxmalware
2018年oakland论文:理解linux恶意软件 论文地址:http://www.s3.eurecom.fr/~yanick/publications/2018_oakland_linuxmalw ...
- 实验3 分支&循环语句(1)
part 1 1.在循环中使用控制语句continue和break,其功能区别是: continue:只控制本次循环的结束. break:终止并跳出循环,之后的循环也不再执行. 2.在两层嵌套循环中 ...
- 关于 QObject 类
1.QObject类 简述 QObject类是所有Qt对象的基类. QObject是Qt对象模型的核心. 该模型的核心特征是称为信号和槽的对象通信机制. 您可以使用connect()将信号连接到槽 ...
- non-JRMP server at remote endpoint
#在相应的domain的domain.xml文件添加下面红色设置,并重启domain <admin-service system-jmx-connector-name="system& ...
- 移动网页端HTML5 meta便签
width = device-width:标识宽度是设备屏幕的宽度 initial-scale = 1.0 :标识初始的缩放比例 minimum-scale =0.5 :表示最小的缩放比例 maxim ...
- 文件操作-cd
cd命令是linux实际使用当中另一个非常重要的命令,本文就为大家介绍下Linux中cd命令的用法. 转载自 https://www.cnblogs.com/waitig/p/5880719.html ...
- python数据类型、字符编码、文件处理-练习
练习-字符串 # 写代码,有如下变量,请按照要求实现每个功能 (共6分,每小题各0.5分) name = " aleX" # ) 移除 name 变量对应的值两边的空格,并输出处理 ...