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\),更别说动态点分治了... 于是来复习一下. ...
随机推荐
- 用cssText批量修改样式
一般情况下我们用js设置元素对象的样式会使用这样的形式: var element= document.getElementById(“id”);element.style.width=”20px”;e ...
- c# DateTime常用用法
参考:http://sqlyuju.com/c-datetime-hh-hh-qubie.html https://www.cnblogs.com/xiongxiaobai/p/5282827.htm ...
- javascript顺序数组简单实现个二分查找
直接上码了注释写得很详细: function bsearch(A,x){ //l:查找范围左 r:查找范围右 let l = 0, //查询范围左边界 r = A.length-1, //查找范围右边 ...
- 【dp】bzoj1613: [Usaco2008 Jan]Running贝茜的晨练计划
还记得这是以前看上去的不可做题…… Description 奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行N(1<=N<=10,000)分钟的晨跑.在 ...
- 【OS_Linux】Linux系统中目录及文件管理
1.Linux系统中目录的树状结构 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录, ...
- redo log日志内容备忘
检查点是一串递增的数字. 在两个检查点之间,存在有一个MLOG_FILE_NAME的文件,里面记录着space和路径和MLOG_CHECKPOINT的一个检查点. MLOG_FILE_NAME总是在上 ...
- (19)zabbix Applications使用介绍
介绍 Applications(我们翻译为应用程序)是item的一个组. 例如我们要监控MySQL,我们可以将所有和MySQL相关的item放到这个应用程序中. 例如MySQL的availabilit ...
- PHP方法之 substr
简单描述: substr 主要用于字符串的截取,但是不适用于中文字符串,易出现乱码,中文字符串可使用mbstring. 方法申明: substr(string,start,length) string ...
- InnoDB体系架构总结(二)
事务 确保事务内的SQL都可以同步执行 要么一起成功 要么一起失败.事务有四个特性原子性 一致性,隔离性,持久性 实现方式 开始事务的时候回家记录记录一个LSN日志序列 当事务执行的时候 会首先在In ...
- 分享读C Primer Plus时遇到的一个问题(补档5月7日)
最近在学习C Primer Plus.书中第66页,3.8 关键概念 这一小节中有这一段话: “计算机中的浮点数和整数在本质上不同,其存储方式和运算过程有很大区别.即使两个 32 位存储单元存储的位组 ...