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\),更别说动态点分治了... 于是来复习一下. ...
随机推荐
- CloudFoundry命令行和Kubernetes命令行的Restful API消费方式
先说CloudFoundry的命令行工具CLI.我们在CloudFoundry环境下工作,第一个使用的命令就是cf login. 如果在环境变量里维护CF_TRACE的值为true: 则我们能发现,诸 ...
- (转)SpringMVC学习(二)——SpringMVC架构及组件
http://blog.csdn.net/yerenyuan_pku/article/details/72231385 相信大家通过前文的学习,已经对SpringMVC这个框架多少有些理解了.还记得上 ...
- mysql 存在更新,不存在插入
String sql = "insert into wb_result " + "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ...
- 理解Vue
Vue.js是JavaScript MVVM(Model-View-ViewModel)库,十分简洁,Vue核心只关注视图层,相对AngularJS提供更加简洁.易于理解的API.Vue尽可能通过简单 ...
- 屏蔽Alt+F4关闭窗体
实现效果: 知识运用: KeyEventArgs类的Alt,Handled属性 public virtual bool Alt {get;} //获取一个值 该值指示是否曾按下Alt键 public ...
- PAT (Basic Level) Practise (中文)-1028. 人口普查(20)
PAT (Basic Level) Practise (中文)-1028. 人口普查(20) http://www.patest.cn/contests/pat-b-practise/1028 某 ...
- iOS7.1企业版发布后用户通过sarafi浏览器安装无效的解决方案
关于iOS7.1企业版发布后,用户通过sarafi浏览器安装无效的解决方案: 通过测试,已经完美解决. 方案一: iOS7.1企业应用无法安装应用程序 因为证书无效的解决方案 http://blog. ...
- 低性能3张图片轮播React组件
import React from 'react'; import {getSwipeWay} from '../utils/swipe'; class Carousel extends React. ...
- web资源持续更新----20150213
响应式设计创意收集网站:http://mediaqueri.es css禅意花园 http://www.csszengarden.com/
- HDU-2544-最短路(floyd)
板子题,实验一下floyd. #include <cstdio> #include <algorithm> #include <cstring> using nam ...