树链剖分,线段树维护~

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <vector>
  6. using namespace std;
  7.  
  8. const int MAXN = ;
  9. struct Edge
  10. {
  11. int to,next;
  12. }edge[MAXN*];
  13. int head[MAXN],tot;
  14. int top[MAXN];//top[v]表示v所在的重链的顶端节点
  15. int fa[MAXN]; //父亲节点
  16. int deep[MAXN];//深度
  17. int num[MAXN];//num[v]表示以v为根的子树的节点数
  18. int p[MAXN];//p[v]表示v与其父亲节点的连边在线段树中的位置
  19. int fp[MAXN];//和p数组相反
  20. int son[MAXN];//重儿子
  21. int pos;
  22. void init()
  23. {
  24. tot = ;
  25. memset(head,-,sizeof(head));
  26. pos = ;
  27. memset(son,-,sizeof(son));
  28. }
  29. void addedge(int u,int v)
  30. {
  31. edge[tot].to = v;edge[tot].next = head[u];head[u] = tot++;
  32. }
  33. void dfs1(int u,int pre,int d) //第一遍dfs求出fa,deep,num,son
  34. {
  35. deep[u] = d;
  36. fa[u] = pre;
  37. num[u] = ;
  38. for(int i = head[u];i != -; i = edge[i].next)
  39. {
  40. int v = edge[i].to;
  41. if(v != pre)
  42. {
  43. dfs1(v,u,d+);
  44. num[u] += num[v];
  45. if(son[u] == - || num[v] > num[son[u]])
  46. son[u] = v;
  47. }
  48. }
  49. }
  50. void getpos(int u,int sp) //第二遍dfs求出top和p
  51. {
  52. top[u] = sp;
  53. if(son[u] != -)
  54. {
  55. p[u] = pos++;
  56. fp[p[u]] = u;
  57. getpos(son[u],sp);
  58. }
  59. else
  60. {
  61. p[u] = pos++;
  62. fp[p[u]] = u;
  63. return;
  64. }
  65. for(int i = head[u] ; i != -; i = edge[i].next)
  66. {
  67. int v = edge[i].to;
  68. if(v != son[u] && v != fa[u])
  69. getpos(v,v);
  70. }
  71. }
  72.  
  73. //线段树
  74. struct Node
  75. {
  76. int l,r;
  77. int Max;
  78. }segTree[MAXN*];
  79. void build(int i,int l,int r)
  80. {
  81. segTree[i].l = l;
  82. segTree[i].r = r;
  83. segTree[i].Max = ;
  84. if(l == r)return;
  85. int mid = (l+r)/;
  86. build(i<<,l,mid);
  87. build((i<<)|,mid+,r);
  88. }
  89. void push_up(int i)
  90. {
  91. segTree[i].Max = max(segTree[i<<].Max,segTree[(i<<)|].Max);
  92. }
  93. void update(int i,int k,int val) // 更新线段树的第k个值为val
  94. {
  95. if(segTree[i].l == k && segTree[i].r == k)
  96. {
  97. segTree[i].Max = val;
  98. return;
  99. }
  100. int mid = (segTree[i].l + segTree[i].r)/;
  101. if(k <= mid)update(i<<,k,val);
  102. else update((i<<)|,k,val);
  103. push_up(i);
  104. }
  105. int query(int i,int l,int r) //查询线段树中[l,r] 的最大值
  106. {
  107. if(segTree[i].l == l && segTree[i].r == r)
  108. return segTree[i].Max;
  109. int mid = (segTree[i].l + segTree[i].r)/;
  110. if(r <= mid)return query(i<<,l,r);
  111. else if(l > mid)return query((i<<)|,l,r);
  112. else return max(query(i<<,l,mid),query((i<<)|,mid+,r));
  113. }
  114. int find(int u,int v)//查询u->v边的最大值
  115. {
  116. int f1 = top[u], f2 = top[v];
  117. int tmp = ;
  118. while(f1 != f2)
  119. {
  120. if(deep[f1] < deep[f2])
  121. {
  122. swap(f1,f2);
  123. swap(u,v);
  124. }
  125. tmp = max(tmp,query(,p[f1],p[u]));
  126. u = fa[f1]; f1 = top[u];
  127. }
  128. if(u == v)return tmp;
  129. if(deep[u] > deep[v]) swap(u,v);
  130. return max(tmp,query(,p[son[u]],p[v]));
  131. }
  132. int e[MAXN][];
  133. int main()
  134. {
  135. //freopen("in.txt","r",stdin);
  136. //freopen("out.txt","w",stdout);
  137. int T;
  138. int n;
  139. scanf("%d",&T);
  140. while(T--)
  141. {
  142. init();
  143. scanf("%d",&n);
  144. for(int i = ;i < n-;i++)
  145. {
  146. scanf("%d%d%d",&e[i][],&e[i][],&e[i][]);
  147. addedge(e[i][],e[i][]);
  148. addedge(e[i][],e[i][]);
  149. }
  150. dfs1(,,);
  151. getpos(,);
  152. build(,,pos-);
  153. for(int i = ;i < n-; i++)
  154. {
  155. if(deep[e[i][]] > deep[e[i][]])
  156. swap(e[i][],e[i][]);
  157. update(,p[e[i][]],e[i][]);
  158. }
  159. char op[];
  160. int u,v;
  161. while(scanf("%s",op) == )
  162. {
  163. if(op[] == 'D')break;
  164. scanf("%d%d",&u,&v);
  165. if(op[] == 'Q')
  166. printf("%d\n",find(u,v));
  167. else update(,p[e[u-][]],v);
  168. }
  169. }
  170. return ;
  171. }

SPOJ QTREE Query on a Tree【树链剖分模板题】的更多相关文章

  1. spoj QTREE - Query on a tree(树链剖分+线段树单点更新,区间查询)

    传送门:Problem QTREE https://www.cnblogs.com/violet-acmer/p/9711441.html 题解: 树链剖分的模板题,看代码比看文字解析理解来的快~~~ ...

  2. SPOJ QTREE Query on a tree ——树链剖分 线段树

    [题目分析] 垃圾vjudge又挂了. 树链剖分裸题. 垃圾spoj,交了好几次,基本没改动却过了. [代码](自带常数,是别人的2倍左右) #include <cstdio> #incl ...

  3. SPOJ QTREE Query on a tree 树链剖分+线段树

    题目链接:http://www.spoj.com/problems/QTREE/en/ QTREE - Query on a tree #tree You are given a tree (an a ...

  4. SPOJ QTREE Query on a tree --树链剖分

    题意:给一棵树,每次更新某条边或者查询u->v路径上的边权最大值. 解法:做过上一题,这题就没太大问题了,以终点的标号作为边的标号,因为dfs只能给点分配位置,而一棵树每条树边的终点只有一个. ...

  5. SPOJ 375 Query on a tree 树链剖分模板

    第一次写树剖~ #include<iostream> #include<cstring> #include<cstdio> #define L(u) u<&l ...

  6. spoj 375 QTREE - Query on a tree 树链剖分

    题目链接 给一棵树, 每条边有权值, 两种操作, 一种是将一条边的权值改变, 一种是询问u到v路径上最大的边的权值. 树链剖分模板. #include <iostream> #includ ...

  7. SPOJ Query on a tree 树链剖分 水题

    You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  8. spoj 375 Query on a tree (树链剖分)

    Query on a tree You are given a tree (an acyclic undirected connected graph) with N nodes, and edges ...

  9. Query on a tree 树链剖分 [模板]

    You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  10. Hdu 5274 Dylans loves tree (树链剖分模板)

    Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...

随机推荐

  1. AcWing 8.二维费用的背包问题

    #include<iostream> #include<algorithm> #include<cstring> using namespace std ; ; i ...

  2. Java爬虫学习(3)之用对象保存新浪微博博文

    package com.mieba; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.c ...

  3. 生产环境设置mysql主从复制

    Slave服务器的版本要等于或者高于master服务器 现在的实例是在mysql 5.7上的主从配置 a) master服务器的my.cnf配置,server_id 推荐用IP的后两位数字 [mysq ...

  4. AJAX--XMLHttpRequest对象

    创建XMLHttpRequest对象 XMLHttpRequest是AJAX的基础. 所有现代浏览器(IE7+.Firefox.Chrome.Safari以及Opera)均内建XMLHttpReque ...

  5. 按需引入element-ui时修改.babelrc报错

    刚开始学习element-ui时用的都是完整引入,图省事,这次准备按需引入,以减小项目体积, 乙烯类npm 之后,到了修改 .babelrc 文件这一步(PS:vue-cli 2.0版本会有这个文件, ...

  6. 【网易官方】极客战记(codecombat)攻略-地牢-恐惧之门

    关卡连接: https://codecombat.163.com/play/level/dread-door 恐惧之门后藏满宝藏 简介: while-true 循环可以使用任何方法,如: while ...

  7. AndroidStudio3.3+OpenCV开发环境搭建

    创建一个Android Studio普通项目 导入module 选择 File → New → Import Module 选择解压好的opencv-android-sdk下的sdk下的java,点O ...

  8. oracle建表时出现“标识符无效”错误

    oracle用以下sql语句新建表时,出现"标识符无效"错误: create table users( user_id integer not null, user_name va ...

  9. 生成树计数 lighting 最终决定用这个模板! (有逆元的模板)

    #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> # ...

  10. java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [META-INF/services/com.alibaba.druid.filter.Filter].

    九月 11, 2019 2:56:36 下午 org.apache.catalina.loader.WebappClassLoaderBase checkStateForResourceLoading ...