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\),更别说动态点分治了... 于是来复习一下. ...
随机推荐
- leetcode_1048. Longest String Chain_[DP,动态规划,记忆化搜索]
1048. Longest String Chain https://leetcode.com/problems/longest-string-chain/ Let's say word1 is a ...
- shelll脚本,根据软链接,找到真实路径
[root@localhost tmp]# ls -l total lrwxrwxrwx root root Sep : abc -> /etc/passwd lrwxrwxrwx root r ...
- shell脚本,计算从0+2+4+6+....100的结果是多少?
[root@localhost wyb]# cat evenjia.sh #!/bin/bash #从0++++...100的结果 i= ` do sum=$(($sum+i)) i=$(($i+)) ...
- rhel7.3smb安装配置
rhel7.3smb安装配置 1.安装 yum -y install samba samba-client cifs-utils 2.配置开机自启动,覆盖原配置文件 systemctl enable ...
- 自写小函数处理 javascript 0.3*0.2 浮点类型相乘问题
const reg = /^([-+]?)([0-9]+)\.([0-9]*)$/; // 判断是不是浮点数 const isFloat = function(number){ return reg. ...
- How To:Linux下如何通过命令检查网卡是否插上网线
主要工具为ethtool来检查,主要关注的字段为"Link detected",注意如下的输出,其中em4实际物理上并未插上网线,而em1是插上网线的: # ethtool em4 ...
- POJ 2255 Tree Recovery——二叉树的前序遍历、后序遍历、中序遍历规则(递归)
1.前序遍历的规则:(根左右) (1)访问根节点 (2)前序遍历左子树 (3)前序遍历右子树 对于图中二叉树,前序遍历结果:ABDECF 2.中序遍历的规则:(左根右) (1)中序遍历左子树 (2)访 ...
- 哪些 Python 库让你相见恨晚?
知乎用户,A European Swallow. 苇叶.Aran He.jerry等人赞同 补充三个有助于自动化日常工作的: sh:sh 1.08 — sh v1.08 documentation可以 ...
- 手动搭建redis集群(3台)
安装redis 1.搜索源中的redis包 apt-cache pkgnames | grep redis 2.安装redis-server apt-get install redis-server ...
- Python解释器镜像源修改
目录 Windows Mac 这篇文章将解除你使用python的pip install xxx受到的网速限制,如果只是下载较小的第三方库,可以尝试pip --default-timeout=100 i ...