[BZOJ 2588]Count on a tree
传送门
LCA+主席树(可持久化线段树)
取一个点为根,每棵线段树记录树上节点到根的链上的权在数轴上的分布(当然要离散化),
则对于两个点u,v的路径上的数在数轴上的分布可以表示为tree[u]+tree[v]-tree[lca(u,v)]-tree[fa(u,v)](可以随便画图YY一下),
然后就可以在得到的树上查询了。
代码:
#include<bits/stdc++.h> using namespace std; #define N ((1<<17)-1)int n,m,rv[N],v[N],dep[N],jp[N][20],cnt,p[N]; bool vis[N]; vector<vector<int> >G;struct SN{SN *son[2];int val; }sn[N*20],*root[N];void build(SN&x,int l,int r) {if (l==r) return;int m=(l+r)>>1;x.son[0]=&sn[++cnt];x.son[1]=&sn[++cnt];build(*x.son[0],l,m);build(*x.son[1],m+1,r); }inline bool cmp(int a,int b){return rv[a]<rv[b];}void putin() {int i,x,y;scanf("%d%d",&n,&m);G.resize(n+1);for (i=1;i<=n;i++) scanf("%d",&rv[i]),p[i-1]=i;sort(p,p+n,cmp);for (i=0;i<n;i++) v[p[i]]=i;for (i=0;i<n-1;i++){scanf("%d%d",&x,&y);G[x].push_back(y);G[y].push_back(x);}build(sn[0],0,n-1);root[0]=&sn[0]; }void rebuild(SN&x,int l,int r,int k) {x.val++;if (l==r) return;int m=(l+r)>>1,s;if (k<=m) s=0,r=m;else s=1,l=m+1;sn[++cnt]=*x.son[s];x.son[s]=&sn[cnt];rebuild(*x.son[s],l,r,k); }void dfs(int x,int f,int d) {int i;vis[x]=1;dep[x]=d;jp[x][0]=f;for (i=0;jp[x][i];i++)jp[x][i+1]=jp[jp[x][i]][i];root[x]=&sn[++cnt];*root[x]=*root[f];rebuild(*root[x],0,n-1,v[x]);for (i=0;i<G[x].size();i++)if (!vis[G[x][i]]) dfs(G[x][i],x,d+1); }int search(SN&a,SN&b,SN&c,SN&d,int l,int r,int k) {if (l==r) return l;int val=(*a.son[0]).val+(*b.son[0]).val-(*c.son[0]).val-(*d.son[0]).val;int m=(l+r)>>1,s;if (val>=k) s=0,r=m;else s=1,k-=val,l=m+1;return search(*a.son[s],*b.son[s],*c.son[s],*d.son[s],l,r,k); }int LCA(int u,int v) {int i;if (dep[u]!=dep[v]){if (dep[u]<dep[v]) swap(u,v);for (i=17;i>=0;i--)if (dep[u]-(1<<i)>=dep[v])u=jp[u][i];}if (u==v) return u;for (i=17;i>=0;i--)if (jp[u][i]!=jp[v][i]) {u=jp[u][i];v=jp[v][i];}return jp[u][0]; }void answer() {int i,ans=0,u,v,k,lca;for (i=0;i<m;i++){scanf("%d%d%d",&u,&v,&k);u^=ans;lca=LCA(u,v);ans=rv[p[search(*root[u],*root[v],*root[lca],*root[jp[lca][0]],0,n-1,k)]];printf("%d",ans);if (i<m-1) printf("\n");} }int main() {putin();dfs(1,0,1);answer(); }
View Code
檢測語言阿尔巴尼亚语阿拉伯语阿塞拜疆语爱尔兰语爱沙尼亚语巴斯克语白俄罗斯语保加利亚语冰岛语波兰语波斯尼亚语波斯语布尔语(南非荷兰语)丹麦语德语俄语法语菲律宾语芬兰语高棉语格鲁吉亚语古吉拉特语哈萨克语海地克里奥尔语韩语豪萨语荷兰语加利西亚语加泰罗尼亚语捷克语卡纳达语克罗地亚语拉丁语拉脱维亚语老挝语立陶宛语罗马尼亚语马尔加什语马耳他语马拉地语马拉雅拉姆语马来语马其顿语毛利语蒙古语孟加拉语缅甸语苗语南非祖鲁语尼泊尔语挪威语旁遮普语葡萄牙语齐切瓦语日语瑞典语塞尔维亚语塞索托语僧伽罗语世界语斯洛伐克语斯洛文尼亚语斯瓦希里语宿务语索马里语塔吉克语泰卢固语泰米尔语泰语土耳其语威尔士语乌尔都语乌克兰语乌兹别克语希伯来语希腊语西班牙语匈牙利语亚美尼亚语伊博语意大利语意第绪语印地语印尼巽他语印尼语印尼爪哇语英语约鲁巴语越南语中文简体中文繁体 | 阿尔巴尼亚语阿拉伯语阿塞拜疆语爱尔兰语爱沙尼亚语巴斯克语白俄罗斯语保加利亚语冰岛语波兰语波斯尼亚语波斯语布尔语(南非荷兰语)丹麦语德语俄语法语菲律宾语芬兰语高棉语格鲁吉亚语古吉拉特语哈萨克语海地克里奥尔语韩语豪萨语荷兰语加利西亚语加泰罗尼亚语捷克语卡纳达语克罗地亚语拉丁语拉脱维亚语老挝语立陶宛语罗马尼亚语马尔加什语马耳他语马拉地语马拉雅拉姆语马来语马其顿语毛利语蒙古语孟加拉语缅甸语苗语南非祖鲁语尼泊尔语挪威语旁遮普语葡萄牙语齐切瓦语日语瑞典语塞尔维亚语塞索托语僧伽罗语世界语斯洛伐克语斯洛文尼亚语斯瓦希里语宿务语索马里语塔吉克语泰卢固语泰米尔语泰语土耳其语威尔士语乌尔都语乌克兰语乌兹别克语希伯来语希腊语西班牙语匈牙利语亚美尼亚语伊博语意大利语意第绪语印地语印尼巽他语印尼语印尼爪哇语英语约鲁巴语越南语中文简体中文繁体 |
转载于:https://www.cnblogs.com/KaNNeXFF/p/5441265.html
[BZOJ 2588]Count on a tree相关推荐
- BZOJ 2588 Spoj 10628 Count on a tree | 树上主席树
BZOJ 2588 Count on a tree 题面 求树上两点之间路径上第k大的点权. 题解 一开始看到这道题觉得是树剖,然后又听说是主席树,然后以为是主席树+树剖,差点没吓死-- 然后发现,如 ...
- BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树
2588: Spoj 10628. Count on a tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/J ...
- BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )
Orz..跑得还挺快的#10 自从会树链剖分后LCA就没写过倍增了... 这道题用可持久化线段树..点x的线段树表示ROOT到x的这条路径上的权值线段树 ----------------------- ...
- bzoj 2588 Spoj 10628. Count on a tree (可持久化线段树)
Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MB Submit: 7669 Solved: 1894 [Sub ...
- 主席树 || 可持久化线段树 || LCA || BZOJ 2588: Spoj 10628. Count on a tree || Luogu P2633 Count on a tree...
题面: Count on a tree 题解: 主席树维护每个节点到根节点的权值出现次数,大体和主席树典型做法差不多,对于询问(X,Y),答案要计算ans(X)+ans(Y)-ans(LCA(X,Y) ...
- Count on a tree
bzoj 2588: Spoj 10628. Count on a tree http://www.lydsy.com/JudgeOnline/problem.php?id=2588 Descrip ...
- BZOJ2588 Count on a tree 【树上主席树】
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MB Submit: 7577 Solved: 185 ...
- BZOJ2588 Count on a tree DFS序+LCA+值域主席树
Count on a tree 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答 ...
- [SPOJ-COT]Count on a tree
[SPOJ-COT]Count on a tree 题面 You are given a tree with N nodes. The tree nodes are numbered from 1 t ...
最新文章
- 买了一个软件测试就业班课程,不知道值不值
- Atitit. 订单管理 收银单持久化 功能设计 基于ecshop订单结构
- 刚弄好的中台!又要开始拆了?难道是为了凑工作量?
- html媒体查询怎么把颜色换成图片,为网页中图片src添加媒体查询功能。
- ZOJ 3827 Information Entropy(数学题 牡丹江现场赛)
- 2019年最佳Python学习路线
- UE4学习-阶段性总结1
- 真正能成大事的人,往往有一个“共同特征”
- 自定义敏感词检测器_使用转移学习创建自己的自定义对象检测器
- Java使用zip4j库 压缩文件工具类(自适应压缩包编码格式)
- adb 连接逍遥游模拟器搭配monkey命令 抓取 logcat日志
- 195. 中文小说出海资料整理
- 解决gradle编译报Error:All flavors must now belong to a named flavor dimension.问题
- 如何查看windows版本
- Axure RP 8.1下载 +汉化
- 易观郭炜:流动水系数造未来
- 使用css实现一个正方形
- 玩转linux 这些命令就够了
- 电脑必备常用软件好用的软件合集
- 计算机基础知识:通用快速进入Windows用户某个文件夹
热门文章
- php ajax 注册,非常实用的ajax用户注册模块
- java中删除sqlite数据库语句_sqlite数据库的介绍与java操作sqlite的实例讲解
- Serverless 工程实践 | 零基础上手 Knative 应用
- OpenKruise v0.5.0 版本发布,支持无损的流式分批发布策略
- Jmeter脚本录制(Web)
- 360drive可以卸载吗_Windows 10下的软件卸载你会吗?不会可以看过来!
- php连接mysql总结_php连接数据库的三种方式的总结
- 新买的笔记本电脑怎么分盘_电脑怎么增加C盘空间?黑客教你不花钱增加C盘空间...
- TypeError: rectangle() got an unexpected keyword argument ‘width‘报错:
- 中国中草药提取物市场需求容量与投资价值预测报告2022年