正题

题目链接:https://www.luogu.com.cn/problem/P2633


题目大意

nnn个点的树,每个点有点权,求u∼vu\sim vu∼v的路径上第kkk小的权值,强制在线。


解题思路

考虑在树上维护主席树,我们不难发现如果sizxsiz_xsizx​表示根节点到这个点的路径上点权在一个范围内的数量,对于路径u∼vu\sim vu∼v有sizu+sizv−sizlca(u,v)−sizfa(lca(u,v))siz_u+siz_v-siz_{lca(u,v)}-siz_{fa(lca(u,v))}sizu​+sizv​−sizlca(u,v)​−sizfa(lca(u,v))​
所以我们可以对于每个点维护一个该节点到根路径信息的主席树,然后对于每个询问我们用四棵主席树做差即可。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)(开始以为要树链剖分就写了个,用来求LCALCALCA算了)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct node{int to,next;
}a[N*2];
int n,m,num,cnt,tot,w[N],b[N],rt[N],ls[N];
int top[N],fa[N],dep[N],siz[N],son[N];
struct Seq_Tree{int w[N*80],ls[N*80],rs[N*80];int Change(int x,int L,int R,int pos){int y=++cnt;w[y]=w[x]+1;if(L==R)return y;int mid=(L+R)>>1;if(pos<=mid)ls[y]=Change(ls[x],L,mid,pos),rs[y]=rs[x];else rs[y]=Change(rs[x],mid+1,R,pos),ls[y]=ls[x];return y;}int Ask(int x1,int x2,int x3,int x4,int k,int L,int R){if(L==R)return R;int mid=(L+R)>>1;int z=w[ls[x1]]+w[ls[x2]]-w[ls[x3]]-w[ls[x4]];if(k<=z)return Ask(ls[x1],ls[x2],ls[x3],ls[x4],k,L,mid);return Ask(rs[x1],rs[x2],rs[x3],rs[x4],k-z,mid+1,R);}
}T;
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs1(int x){siz[x]=1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa[x])continue;fa[y]=x;dep[y]=dep[x]+1;dfs1(y);siz[x]+=siz[y];if(siz[y]>siz[son[x]])son[x]=y;}return;
}
void dfs2(int x){rt[x]=T.Change(rt[fa[x]],1,num,w[x]);if(son[x]){top[son[x]]=top[x];dfs2(son[x]);}for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa[x]||y==son[x])continue;top[y]=y;dfs2(y);}return;
}
int LCA(int x,int y){while(top[x]!=top[y])if(dep[top[x]]<dep[top[y]])y=fa[top[y]];else x=fa[top[x]];if(dep[x]<dep[y])return x;return y;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&w[i]),b[i]=w[i];num=n;sort(b+1,b+1+num);num=unique(b+1,b+1+num)-b-1;for(int i=1;i<=n;i++)w[i]=lower_bound(b+1,b+1+num,w[i])-b;for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}dfs1(1);dfs2(1);int last=0;while(m--){int x,y,k;scanf("%d%d%d",&x,&y,&k);x=x^last;int lca=LCA(x,y);printf("%d\n",last=b[T.Ask(rt[x],rt[y],rt[lca],rt[fa[lca]],k,1,num)]);}return 0;
}

P2633-Count on a tree【主席树,LCA】相关推荐

  1. SPOJ 10628 Count on a tree 主席树 附数据生成器

    很奇怪的题啊,感觉思路和别人一样,但是我得用快速IO才能AC--不然就T 没用快速output,只用了快速input 而且居然限制代码长度...代码要短于6000B,我改了好久啊 题目大意:给一棵树, ...

  2. bzoj2588: Spoj 10628. Count on a tree 主席树

    在每一个点的父亲做主席树,每次访问时用两个点的和减去其LCA和LCA父亲的和即可. #include<bits/stdc++.h> using namespace std; inline ...

  3. SPOJ COT Count on a tree 主席树

    题意: 给\(n(1 \leq n \leq 10^5)\)一棵树,每个点有个权值. 还有\(m(1 \leq m \leq 10^5)\)个询问: \(u \, v \, k\),查询路径\(u \ ...

  4. P2633 Count on a tree

    P2633 Count on a tree 题意: 给定一棵 n 个节点的树,每个点有一个权值.有 m 个询问,每次给你 u,v,k,你需要回答 u xor last 和 v 这两个节点间第 k 小的 ...

  5. 主席树 || 可持久化线段树 || 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) ...

  6. 主席树 ---- LCA(树上第k大)Count on a tree

    题目链接:https://www.spoj.com/problems/COT/en/ 题意: 给你一颗树,问你u,v结点这条路径上第k大是多少. 思路:就是说先将无根树转化为有根树,然后对每一条链建立 ...

  7. BZOJ2588 Count on a tree DFS序+LCA+值域主席树

    Count on a tree 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答 ...

  8. 洛谷P2633 Count on a tree

    题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...

  9. HDU - 3804 Query on a tree(主席树维护最大值+离散化)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...

最新文章

  1. EBS-使用 fnd_user_pkg API 创建用户,添加职责,修改用户
  2. Android官方提供的支持不同屏幕大小的全部方法
  3. 实时把你的脸变成名画,手机摄像头新玩法
  4. 挖掘形态数轴的不确定性
  5. 【题解】JSOIWC2019 Round4
  6. cocos2D(四)---- CCSprite
  7. 案例:隐秘而低调的内存泄露(OOM)
  8. linux分区文件 pe,关于linux的磁盘和分区的操作(一)
  9. git 查看自己的用户名和邮箱
  10. jQuery-实例方法
  11. 服务器隐藏盘符如何显示,Windows10系统如何使用注册表隐藏磁盘盘符?
  12. 科学和工程中的信号处理
  13. LCD12864的操作例程
  14. uni-swipe-action失效?
  15. [2020.1.10]systemd介绍
  16. uniapp中,H5端使用html2canvas生成海报
  17. 佳片有约|《第六感生死缘》:生如夏花,死若秋叶的爱恋
  18. 积分商城该如何帮助商家盈利
  19. 计算机教室100字介绍,描写教室的作文100字
  20. Rasa Stack:创建支持上下文的人工智能助理和聊天机器人教程

热门文章

  1. oracle bcp out,SQL Server利用bcp命令把SQL语句结果生成文本文件
  2. oracle体系结构和组件图示,Oracle 体系结构组件
  3. java如何用键盘输入_java中如何从键盘输入(附代码)
  4. java 支付宝 退款_Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)
  5. 利用计算机制作多媒体最后一步,福建省高中会考 多媒体技术应用 选择题专项练习十一(201206)(有答案)...
  6. 查询2021抚顺高考成绩,2021年抚顺高考状元是谁分数多少分,历年抚顺高考状元名单...
  7. 项目进度计划甘特图_项目管理进度计划表制作及甘特图绘制方法
  8. freertos源码详解与应用开发 pdf_互联网企业面试必问Spring源码?搞定Spring源码,看完这篇就够了...
  9. Java实现Huffman哈夫曼树
  10. C++实现顺序串(完整代码)