BZOJ2588Count on a tree——LCA+主席树
题目描述
输入
输出
M行,表示每个询问的答案。最后一个询问不输出换行符
样例输入
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
样例输出
8
9
105
7
提示
- #include<map>
- #include<set>
- #include<queue>
- #include<cmath>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define mid (L+R)/2
- using namespace std;
- int ans;
- int tot;
- int cnt;
- int anc;
- int n,m,q;
- int x,y,z;
- int d[100010];
- int v[100010];
- int h[100010];
- int l[3000010];
- int r[3000010];
- int to[200010];
- int head[100010];
- int next[200010];
- int sum[3000010];
- int root[100010];
- int f[100010][20];
- map<int,int>b;
- void add(int x,int y)
- {
- tot++;
- next[tot]=head[x];
- head[x]=tot;
- to[tot]=y;
- }
- int lca(int x,int y)
- {
- if(d[x]<d[y])
- {
- swap(x,y);
- }
- int dep=d[x]-d[y];
- for(int i=0;i<=19;i++)
- {
- if((dep&(1<<i))!=0)
- {
- x=f[x][i];
- }
- }
- if(x==y)
- {
- return x;
- }
- for(int i=19;i>=0;i--)
- {
- if(f[x][i]!=f[y][i])
- {
- x=f[x][i];
- y=f[y][i];
- }
- }
- return f[x][0];
- }
- int updata(int pre,int L,int R,int k)
- {
- int rt=++cnt;
- l[rt]=l[pre];
- r[rt]=r[pre];
- sum[rt]=sum[pre]+1;
- if(L==R)
- {
- return rt;
- }
- else
- {
- if(k<=mid)
- {
- l[rt]=updata(l[pre],L,mid,k);
- }
- else
- {
- r[rt]=updata(r[pre],mid+1,R,k);
- }
- }
- return rt;
- }
- int query(int x,int y,int anc,int fa,int L,int R,int k)
- {
- if(L==R)
- {
- return b[L];
- }
- int num=sum[l[x]]+sum[l[y]]-sum[l[anc]]-sum[l[fa]];
- if(num>=k)
- {
- return query(l[x],l[y],l[anc],l[fa],L,mid,k);
- }
- else
- {
- return query(r[x],r[y],r[anc],r[fa],mid+1,R,k-num);
- }
- }
- void dfs(int x,int fa)
- {
- d[x]=d[fa]+1;
- int k=lower_bound(h+1,h+1+m,v[x])-h;
- b[k]=v[x];
- root[x]=updata(root[fa],1,n,k);
- for(int i=1;i<=19;i++)
- {
- f[x][i]=f[f[x][i-1]][i-1];
- }
- for(int i=head[x];i;i=next[i])
- {
- if(to[i]!=fa)
- {
- f[to[i]][0]=x;
- dfs(to[i],x);
- }
- }
- }
- int main()
- {
- scanf("%d%d",&n,&q);
- for(int i=1;i<=n;i++)
- {
- scanf("%d",&v[i]);
- h[i]=v[i];
- }
- sort(h+1,h+1+n);
- m=unique(h+1,h+1+n)-h-1;
- for(int i=1;i<n;i++)
- {
- scanf("%d%d",&x,&y);
- add(x,y);
- add(y,x);
- }
- dfs(1,0);
- for(int i=1;i<=q;i++)
- {
- scanf("%d%d%d",&x,&y,&z);
- x=x^ans;
- anc=lca(x,y);
- ans=query(root[x],root[y],root[anc],root[f[anc][0]],1,n,z);
- printf("%d\n",ans);
- }
- }
BZOJ2588Count on a tree——LCA+主席树的更多相关文章
- [BZOJ2588]Count on a tree(LCA+主席树)
题面 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个询问 ...
- 【bzoj2588/P2633】count on a tree —— LCA + 主席树
(以下是luogu题面) 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问 ...
- BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )
Orz..跑得还挺快的#10 自从会树链剖分后LCA就没写过倍增了... 这道题用可持久化线段树..点x的线段树表示ROOT到x的这条路径上的权值线段树 ----------------------- ...
- 【BZOJ2588】Count On a Tree(主席树)
[BZOJ2588]Count On a Tree(主席树) 题面 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第 ...
- LCA+主席树 (求树上路径点权第k大)
SPOJ 10628. Count on a tree (树上第k大,LCA+主席树) 10628. Count on a tree Problem code: COT You are given ...
- Count on a tree 树上主席树
Count on a tree 树上主席树 给\(n\)个树,每个点有点权,每次询问\(u,v\)路径上第\(k\)小点权,强制在线 求解区间静态第\(k\)小即用主席树. 树上主席树类似于区间上主席 ...
- hdu 5274 Dylans loves tree(LCA + 线段树)
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- BZOJ_1803_Spoj1487 Query on a tree III_主席树+dfs序
BZOJ_1803_Spoj1487 Query on a tree III_主席树 Description You are given a node-labeled rooted tree with ...
- 【bzoj3123】[Sdoi2013]森林 倍增LCA+主席树+启发式合并
题目描述 输入 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负 ...
随机推荐
- 1-微信小程序开发(安装软件和运行第一个微信小程序)
https://developers.weixin.qq.com/miniprogram/dev/ 我的 打开 上传成功后
- golang 常用包安装
常用到的: go get -v github.com/nsf/gocode go get -v github.com/rogpeppe/godef go get -v golang.org/x/too ...
- http一次请求过程
物理层:支持底层网络协议: 其中网络层支持IP协议: 传输层支持TCP协议,它是面向连接的: 应用层支持 http,ftp tftp,SMTP,DHCP协议 一个完整的http请求过程: 1.浏览器 ...
- UVA1626 - Brackets sequence(区间DP--括号匹配+递归打印)
题目描写叙述: 定义合法的括号序列例如以下: 1 空序列是一个合法的序列 2 假设S是合法的序列.则(S)和[S]也是合法的序列 3 假设A和B是合法的序列.则AB也是合法的序列 比如:以下的都是合法 ...
- 在SpringMVC中使用HandlerInterceptor来实现拦截器功能
需求:我们需要在请求某些特定的URL(URL格式为Restful格式)时添加拦截器,以实现进行权限控制. 如:/ResourcePlan/projectCode/P1503127828/PROJECT ...
- Roslyn入门(一)-C#语法分析
演示环境 Visual Studio 2017 .NET Compiler Platform SDK 简介 今天,Visual Basic和C#编译器是黑盒子:输入文本然后输出字节,编译管道的中间阶段 ...
- Spring RPC 入门学习(2)-获取Map对象
Spring RPC传递Map用例编写 1. 新建RPC接口类 package com.cvicse.ump.rpc.interfaceDefine; import java.util.Map; pu ...
- M1/M2 总结
时光是一列不会回头的列车. 这一学期这么快就过去了,当时刚开始软件工程的那些日子还历历在目.不知道那些如风般过去的日子带给我了什么.然而我又清楚地认识到自己已经改变了. 刚开始软件工程的时候,我对团队 ...
- 第三个Sprint冲刺第3天
成员:罗凯旋.罗林杰.吴伟锋.黎文衷 组内各成员加紧完成自己的工作.
- PyXB: Python XML Schema Bindings
http://pyxb.sourceforge.net/ PyXB (“pixbee”) is a pure Python package that generates Python source c ...