【树上主席树】BZOJ2588-Count on a tree
【题目大意】
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<vector>
- #define lson l,m
- #define rson m+1,r
- using namespace std;
- const int MAXN=+;
- const int DEG=;
- int w[MAXN];
- vector<int> E[MAXN];
- int d,hash[MAXN];
- int T[MAXN],tot,sum[MAXN<<],L[MAXN<<],R[MAXN<<];
- int anc[MAXN][DEG],dep[MAXN];
- int n,m;
- /*Chairman Tree*/
- int build(int l,int r)
- {
- int rt=++tot;
- sum[rt]=;
- if (l!=r)
- {
- int m=(l+r)>>;
- L[rt]=build(lson);
- R[rt]=build(rson);
- }
- return rt;
- }
- int update(int pre,int l,int r,int x)
- {
- int rt=++tot;
- L[rt]=L[pre],R[rt]=R[pre];
- sum[rt]=sum[pre]+;
- if (l!=r)
- {
- int m=(l+r)>>;
- if (x<=m) L[rt]=update(L[pre],lson,x);
- else R[rt]=update(R[pre],rson,x);
- }
- return rt;
- }
- int query(int u,int v,int lca,int lcafa,int l,int r,int k)
- {
- if (l==r) return l;
- int num=(sum[L[u]]-sum[L[lca]]+sum[L[v]]-sum[L[lcafa]]);
- int m=(l+r)>>;
- if (num>=k) return query(L[u],L[v],L[lca],L[lcafa],lson,k);
- else return query(R[u],R[v],R[lca],R[lcafa],rson,k-num);
- }
- /*LCA*/
- void getanc()
- {
- for (int i=;i<DEG;i++)
- for (int j=;j<=n;j++)
- anc[j][i]=anc[anc[j][i-]][i-];
- }
- int swim(int x,int H)
- {
- for (int i=;H>;i++)
- {
- if (H&) x=anc[x][i];
- H>>=;
- }
- return x;
- }
- int LCA(int u,int v)
- {
- if (dep[u]<dep[v]) swap(u,v);
- u=swim(u,dep[u]-dep[v]);
- if (u==v) return u;
- for (int i=DEG-;i>=;i--)
- {
- if (anc[u][i]!=anc[v][i])
- {
- u=anc[u][i];
- v=anc[v][i];
- }
- }
- return anc[u][];
- }
- /*main*/
- void dfs(int u,int pa,int depth)
- {
- anc[u][]=pa;
- dep[u]=depth;
- int x=lower_bound(hash+,hash+d+,w[u])-hash;
- T[u]=update(T[pa],,d,x);
- for (int i=;i<E[u].size();i++)
- if (E[u][i]!=pa) dfs(E[u][i],u,depth+);
- }
- void init()
- {
- scanf("%d%d",&n,&m);
- for (int i=;i<=n;i++) scanf("%d",&w[i]),hash[i]=w[i];
- sort(hash+,hash+n+);
- d=unique(hash+,hash+n+)-(hash+);
- for (int i=;i<n;i++)
- {
- int u,v;
- scanf("%d%d",&u,&v);
- E[u].push_back(v);
- E[v].push_back(u);
- }
- tot=;
- T[]=build(,d);//对于根先建立主席树
- }
- void solve()
- {
- getanc();
- int preans=;
- for (int i=;i<m;i++)
- {
- int u,v,k;
- scanf("%d%d%d",&u,&v,&k);
- u=u^preans;
- int lca=LCA(u,v);
- int ans=query(T[u],T[v],T[lca],T[anc[lca][]],,d,k);
- printf("%d",hash[ans]);
- if (i!=m-) printf("\n");
- preans=hash[ans];
- }
- }
- int main()
- {
- init();
- dfs(,,);
- solve();
- return ;
- }
【树上主席树】BZOJ2588-Count on a tree的更多相关文章
- 洛谷P2633/bzoj2588 Count on a tree (主席树)
洛谷P2633/bzoj2588 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K ...
- Count on a tree 树上主席树
Count on a tree 树上主席树 给\(n\)个树,每个点有点权,每次询问\(u,v\)路径上第\(k\)小点权,强制在线 求解区间静态第\(k\)小即用主席树. 树上主席树类似于区间上主席 ...
- 【洛谷2633】Count on a tree(树上主席树)
点此看题面 大致题意: 给你一棵树,每次问你两点之间第\(k\)小的点权,强制在线. 主席树 这种题目强制在线一般就是数据结构了. 而看到区间第\(k\)小,很容易就能想到主席树. 至少不会有人想到树 ...
- [bzoj2588][count on a tree] (主席树+lca)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- SPOJ COT Count on a tree(树上主席树 + LCA 求点第k小)题解
题意:n个点的树,每个点有权值,问你u~v路径第k小的点的权值是? 思路: 树上主席树就是每个点建一棵权值线段树,具体看JQ博客,LCA用倍增logn求出,具体原理看这里 树上主席树我每个点的存的是点 ...
- p3302 [SDOI2013]森林(树上主席树+启发式合并)
对着题目yy了一天加上看了一中午题解,终于搞明白了我太弱了 连边就是合并线段树,把小的集合合并到大的上,可以保证规模至少增加一半,复杂度可以是\(O(logn)\) 合并的时候暴力dfs修改倍增数组和 ...
- [CSP-S模拟测试]:e(树上主席树)
题目传送门(内部题66) 输入格式 第一行,一个正整数$n$,一个自然数$q$,一个整数$type$.第二行,$n$个正整数,代表$a_i$.接下来$n-1$行,每行两个正整数$u$.$v$,代表树中 ...
- bzoj3123 [Sdoi2013]森林 树上主席树+启发式合并
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3123 题解 如果是静态的查询操作,那么就是直接树上主席树的板子. 但是我们现在有了一个连接两棵 ...
- BZOJ2588 Count on a tree 【树上主席树】
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MB Submit: 7577 Solved: 185 ...
随机推荐
- jquery实现简单轮播
先上简单的html代码 <!DOCTYPE HTML> <html> <head> <link rel="stylesheet" type ...
- VC连接access
(1)首先拷贝 c:\program files\common files\system\ado\ 目录中的 msado15.dll 文件到项目中. (2)在VC中加入DLL,具体方法如下: (3)创 ...
- linux网络配置完全解析
概述:熟悉了windows下面的网络配置,对linux下的网络配置缺未必了解透彻.熟练掌握linux下的网络配置原理,能帮助我们更容易掌握网络传输原理:同时具备一些网络连接不通对应问题的排查能力.文本 ...
- linux驱动开发:用户空间操作LCD显示简单的图片【转】
转自:http://blog.csdn.net/changliang7731/article/details/53074616 上一章我们简单介绍了LCD的一些基本原理.当然更深奥的还有,比如gamm ...
- juery给所有ID属性相同的div绑定一个事件
案例: <div id="div1">内容</div> <div id="div1">内容</div> < ...
- jekyll安装及使用
清除旧版Ruby,若存在 yum remove ruby 若为源码,使用如下命令 cd <your-ruby-source-path> make uninstall 下面开始安装Ruby ...
- email的传输协议与格式(资源链接)
以下链接为转载. 传输协议: 发:SMTP 收:POP3, IMAP 格式: MIME
- [转]Java中堆和栈创建对象的区别
转载自http://blog.csdn.net/hbhhww/article/details/8152838 栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序 ...
- 关于IPMI的几个问题
https://blog.csdn.net/lanyang123456/article/details/51712878
- 关于HTML5 boilerplate 的一些笔记
最近在研究HTML5 boilerplate的模版,以此为线索可以有条理地学习一些前端的best practice,好过在W3C的文档汪洋里大海捞针……啊哈哈哈…… 开头的IE探测与no-js类是什么 ...