题意

\(N\)个点的树,边有边权。给\(M\)个询问,每个询问包含3个参数\(l,r,pos\),求标号在\(l\)到\(r\)中的所有点中,离节点pos最近的点到pos的距离。

分析:动态点分治+Treap

动态树分治。

把分治树给弄出来,用Treap以坐标为关键字,每个点存它在分治树的子树的所有节点到其距离。

这里不用再按照子树划分染色了,因为在同一个子树的点也不会影响结果。

其实用线段树就好了,只不过我傻了就用了Treap。

  1. #define rep(i,a,b) for (int i=(a);i<=(b);i++)
  2. #define pb push_back
  3. #define mp make_pair
  4. #define X first
  5. #define Y second
  6. typedef pair<int,int> PII;
  7. const int N=131072;
  8. const int S=4194304;
  9. const int MAX=INT_MAX;
  10. const int SEC_MAX=INT_MAX>>1;
  11. int n;
  12. vector<PII> g[N];
  13. int vis[N];
  14. int num,siz[N],gvt,gs;
  15. vector<int> atc[N];
  16. int rt[N],tot;
  17. struct Tree {
  18. int lc,rc;
  19. int key,fix;
  20. int val,minVal;
  21. Tree(int _key=0,int _val=SEC_MAX) {
  22. lc=rc=0;
  23. key=_key,fix=rand();
  24. val=minVal=_val;
  25. }
  26. }tr[S];
  27. struct D {
  28. int lc,rc;
  29. D(void) {
  30. lc=rc=0;
  31. }
  32. };
  33. int m;
  34. void Pushup(int x) {
  35. tr[x].minVal=min(tr[tr[x].lc].minVal,tr[tr[x].rc].minVal);
  36. tr[x].minVal=min(tr[x].minVal,tr[x].val);
  37. }
  38. int Merge(int x1,int x2) {
  39. if (!x1) return x2;
  40. if (!x2) return x1;
  41. if (tr[x1].fix<tr[x2].fix) {
  42. tr[x1].rc=Merge(tr[x1].rc,x2);
  43. Pushup(x1);
  44. return x1;
  45. }
  46. else {
  47. tr[x2].lc=Merge(x1,tr[x2].lc);
  48. Pushup(x2);
  49. return x2;
  50. }
  51. }
  52. D Split_Key(int x,int key) {
  53. D t; if (!x) return t;
  54. if (key<tr[x].key) {
  55. t=Split_Key(tr[x].lc,key);
  56. tr[x].lc=t.rc; Pushup(x);
  57. t.rc=x;
  58. }
  59. else {
  60. t=Split_Key(tr[x].rc,key);
  61. tr[x].rc=t.lc; Pushup(x);
  62. t.lc=x;
  63. }
  64. return t;
  65. }
  66. void Insert(int &rt,int x) {
  67. D t=Split_Key(rt,tr[x].key);
  68. rt=Merge(t.lc,x); rt=Merge(rt,t.rc);
  69. }
  70. void Add_Point(int god,int key,int dst) {
  71. tr[++tot]=Tree(key,dst);
  72. Insert(rt[god],tot);
  73. }
  74. int Query(int rt,int l,int r) {
  75. D t1=Split_Key(rt,l-1);
  76. D t2=Split_Key(t1.rc,r);
  77. int t=tr[t2.lc].minVal;
  78. rt=Merge(t2.lc,t2.rc); rt=Merge(t1.lc,rt);
  79. return t;
  80. }
  81. int Siz_DFS(int x,int fa) {
  82. siz[x]=1;
  83. rep(i,1,g[x].size()) {
  84. int nx=g[x][i-1].X;
  85. if (!vis[nx]&&nx!=fa) {
  86. int t=Siz_DFS(nx,x);
  87. siz[x]+=t;
  88. }
  89. }
  90. return siz[x];
  91. }
  92. void Find_Root(int x,int fa) {
  93. int t=num-siz[x];
  94. rep(i,1,g[x].size()) {
  95. int nx=g[x][i-1].X;
  96. if (!vis[nx]&&nx!=fa) {
  97. Find_Root(nx,x);
  98. t=max(t,siz[nx]);
  99. }
  100. }
  101. if (t<gs) {
  102. gs=t;
  103. gvt=x;
  104. }
  105. }
  106. void Link(int god,int x,int fa) {
  107. atc[x].pb(god);
  108. rep(i,1,g[x].size()) {
  109. int nx=g[x][i-1].X;
  110. if (!vis[nx]&&nx!=fa)
  111. Link(god,nx,x);
  112. }
  113. }
  114. void Add(int god,int x,int fa,int dst) {
  115. Add_Point(god,x,dst);
  116. rep(i,1,g[x].size()) {
  117. int nx=g[x][i-1].X,d=g[x][i-1].Y;
  118. if (!vis[nx]&&nx!=fa)
  119. Add(god,nx,x,dst+d);
  120. }
  121. }
  122. void Build(int frm) {
  123. num=Siz_DFS(frm,-1);
  124. gvt=0,gs=MAX; Find_Root(frm,-1);
  125. int x=gvt; vis[x]=1;
  126. Link(x,x,-1);
  127. Add(x,x,-1,0);
  128. rep(i,1,g[x].size()) {
  129. int nx=g[x][i-1].X;
  130. if (!vis[nx])
  131. Build(nx);
  132. }
  133. }
  134. int Min_Dist(int x,int l,int r) {
  135. int res=MAX;
  136. rep(i,1,atc[x].size()) {
  137. int nrt=atc[x][i-1];
  138. int d1=Query(rt[nrt],l,r);
  139. if (d1==SEC_MAX) continue;
  140. int d2=Query(rt[nrt],x,x);
  141. int t=d1+d2;
  142. res=min(res,t);
  143. }
  144. return res;
  145. }
  146. int main(void) {
  147. //...
  148. n=rd();
  149. rep(i,1,n-1) {
  150. int x=rd(),y=rd(),d=rd();
  151. g[x].pb(mp(y,d));
  152. g[y].pb(mp(x,d));
  153. }
  154. Build(1);
  155. int lst=0; m=rd();
  156. rep(i,1,m) {
  157. int l=rd(),r=rd(),pos=rd();
  158. pos^=lst;
  159. lst=Min_Dist(pos,l,r);
  160. printf("%d\n",lst);
  161. }
  162. //...
  163. }

【xsy1230】树的更多相关文章

  1. 【xsy1230】 树(tree) 点分治+线段树

    题目大意:有一棵$n$个节点的树,点的标号为$1$到$n$.树中的边有边权.给你$m$个询问,每个询问包含三个参数$l,r,pos$,你要求出标号在$l$到$r$之间的所有点中,到节点$pos$距离最 ...

  2. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  3. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  4. 再讲IQueryable<T>,揭开表达式树的神秘面纱

    接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...

  5. HDU1671——前缀树的一点感触

    题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...

  6. 算法与数据结构(十一) 平衡二叉树(AVL树)

    今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...

  7. [C#] C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  8. bzoj3207--Hash+主席树

    题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...

  9. bzoj1901--树状数组套主席树

    树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...

随机推荐

  1. 如何用按钮的click事件去触发a标签的click事件

    在jQquery中,可以用如下方式触发input.a标签的click事件: <input id="my_input" /> <a id="my_a&qu ...

  2. soap和wsdl的定义

    SOAP(Simple Object Access Protocol)是一个严格定义的信息交换协议,用于在Web Service中把远程调用和返回封装成机器可读的格式化数据.事实上SOAP数据使用XM ...

  3. WinForm容器内控件批量效验是否允许为空?设置是否只读?设置是否可用等方法分享

    WinForm容器内控件批量效验是否允许为空?设置是否只读?设置是否可用等方法分享 在WinForm程序中,我们有时需要对某容器内的所有控件做批量操作.如批量判断是否允许为空?批量设置为只读.批量设置 ...

  4. 从零开始学Linux[二]:常用操作:用户组、进程、网络、ssh

    摘要:Linux基础学习:创建用户组和用户.软件包管理.磁盘管理.进程管理.前后台进程的切换.网络配置.浏览网页.远程登录ssh 第一节,主要介绍一些简单命令,这节介绍一些日常操作. 1.创建用户组和 ...

  5. Information

    \\server01DESKTOP-RE5QEBU\pqpqlabs\\fileserverpansq@sh.pqlabs.comP1q2w3e

  6. Android -- 仿ios上下反弹效果

    1,前几天在一个app上看到了滑动反弹效果,觉得这个效果挺不错的,然后想自己来实现一下,在网上查了一下基本上都是大致的说了下思路,自己看了一下,决定把实现的思路来详细的写下来,先看一下我们实现的效果吧 ...

  7. UNIX操作系统和Linux操作系统介绍

    UNIX操作系统(尤尼斯),是一个强大的多用户.多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统,最早由KenThompson.DennisRitchie和DouglasMcI ...

  8. iOS 杂记

    一,demo 1,视图跳转 MaryPopin:  https://github.com/Backelite/MaryPopin 2,Nimbus是一个开源的iOS框架,比起Three20,Nimbu ...

  9. WORD基础快捷键

    选择 Alt+Shift+上下     移动整行 Ctrl+上             移动到行首 Ctrl+Shift+上下     选择到行首尾 shift+del         删除整段   ...

  10. php用mysql函数出错

    很可能只是因为你忘了装mysql扩展 apt-get install php5-mysql