lca的做法还是非常明显的。简单粗暴,

只是不是正解。假设树是长链就会跪,直接变成O(n)、、

最后跑的也挺快,出题人还是挺阳光的。。

动态树的解法也是听别人说能ac的。预计就是放在splay上剖分一下,做法还是比較复杂的。,,

来一发lca:

  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <sstream>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <limits.h>
  8. #include <string>
  9. #include <time.h>
  10. #include <math.h>
  11. #include <queue>
  12. #include <stack>
  13. #include <set>
  14. #include <map>
  15. using namespace std;
  16. #define INF 0x3f3f3f3f
  17. #define eps 1e-8
  18. #define pi acos(-1.0)
  19. typedef long long ll;
  20. const int maxn=20010;
  21. int head[maxn],tol,dp[maxn],fa[maxn][20],dep[maxn],weight[maxn];
  22. struct Edge{
  23. int next,to;
  24. Edge(int _next=0,int _to=0){
  25. next=_next;to=_to;
  26. }
  27. }edge[10*maxn];
  28. void addedge(int u,int v){
  29. edge[tol]=Edge(head[u],v);
  30. head[u]=tol++;
  31. }
  32. void bfs(int s){
  33. queue<int> q;
  34. dep[s]=0,fa[s][0]=s;
  35. q.push(s);
  36. while(!q.empty()){
  37. int u=q.front();
  38. q.pop();
  39. for(int i=1;i<20;i++)fa[u][i]=fa[fa[u][i-1]][i-1];
  40. for(int i=head[u];i!=-1;i=edge[i].next){
  41. int v=edge[i].to;
  42. if(v==fa[u][0])continue;
  43. fa[v][0]=u;
  44. dep[v]=dep[u]+1;
  45. q.push(v);
  46. }
  47. }
  48. }
  49. int LCA(int x,int y){
  50. if(dep[x]<dep[y])swap(x,y);
  51. for(int i=19;i>=0;i--)if((1<<i)&(dep[x]-dep[y]))x=fa[x][i];
  52. if(x==y)return x;
  53. for(int i=19;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
  54. return fa[x][0];
  55. }
  56. void dfs(int u,int pre){
  57. dp[u]=weight[u];
  58. for(int i=head[u];i!=-1;i=edge[i].next){
  59. int v=edge[i].to;
  60. if(v==pre)continue;
  61. dfs(v,u);
  62. dp[u]+=dp[v];
  63. }
  64. }
  65. int move(int x,int d){
  66. for(int i=19;i>=0;i--)
  67. if(d&(1<<i))x=fa[x][i];
  68. return x;
  69. }
  70. int main()
  71. {
  72. int T;
  73. cin>>T;
  74. for(int t=1;t<=T;t++){
  75. int n;
  76. scanf("%d",&n);
  77. memset(head,-1,sizeof(head));tol=0;
  78. for(int i=1;i<n;i++){
  79. int x,y;
  80. scanf("%d%d",&x,&y);
  81. addedge(x,y);
  82. addedge(y,x);
  83. }
  84. bfs(1);
  85. for(int i=1;i<=n;i++)scanf("%d",&weight[i]);
  86. dfs(1,-1);
  87. printf("Case #%d:\n",t);
  88. int Q;
  89. scanf("%d",&Q);
  90. int root=1;
  91. while(Q--){
  92. char op[10];
  93. int x,y;
  94. scanf("%s",op);
  95. if(op[0]=='R'){
  96. scanf("%d",&x);
  97. root=x;
  98. }
  99. else if(op[0]=='C'){
  100. scanf("%d%d",&x,&y);
  101. int dd=x;
  102. while(1){
  103. dp[dd]+=y-weight[x];
  104. if(dd==1)break;
  105. dd=fa[dd][0];
  106. }
  107. weight[x] = y;
  108. }
  109. else {
  110. scanf("%d",&x);
  111. if(x==root)printf("%d\n",dp[1]);
  112. else {
  113. int lca=LCA(x,root);
  114. if(lca==x){
  115. int p=move(root,dep[root]-dep[x]-1);
  116. //cout<<"han "<<x<<" "<<root<<" "<<dep[root]-dep[x]-1<<endl;cout<<"p="<<p<<endl;
  117. printf("%d\n",dp[1]-dp[p]);
  118. }
  119. else printf("%d\n",dp[x]);
  120. }
  121. }
  122. }
  123. }
  124. return 0;
  125. }

正解应该是树状数组维护欧拉序列,,

bit的神牛教的。,

详见:点击打开链接

HDU 4836 The Query on the Tree lca || 欧拉序列 || 动态树的更多相关文章

  1. hdu 4836 The Query on the Tree(线段树or树状数组)

    The Query on the Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  2. lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs 倍增

    https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) /* 在这里,对于一个数,选择最左边的 选择任意一个都可以,[left_index, ...

  3. HDU 2814 斐波那契循环节 欧拉降幂

    一看就是欧拉降幂,问题是怎么求$fib(a^b)$,C给的那么小显然还是要找循环节.数据范围出的很那啥..unsigned long long注意用防爆的乘法 /** @Date : 2017-09- ...

  4. HDU 2586(LCA欧拉序和st表)

    什么是欧拉序,可以去这个大佬的博客(https://www.cnblogs.com/stxy-ferryman/p/7741970.html)巨详细 因为欧拉序中的两点之间,就是两点遍历的过程,所以只 ...

  5. HDU 4676 Sum Of Gcd 【莫队 + 欧拉】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=4676 Sum Of Gcd Time Limit: 10000/5000 MS (Java/Others ...

  6. Apple Tree POJ - 3321 dfs序列构造树状数组(好题)

    There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. ...

  7. 【HDU 6191】Query on A Tree 【可持久化字典树】

    题目 给出一棵有n个结点的树,树根是1,每个结点给出一个value.然后给出q个询问,每个询问给出两个整数u和x,你要在以u结点为根的子树中找出一个结点v,使得val[v] xor x最大, 并输出这 ...

  8. HDU 1116 Play on Words(有向欧拉判断)

    题目链接 题意:给出一些单词,问全部单词能否首尾相连 直接 将每一个单词第一个和最后一个字母建立一条有向边,保证除了首尾两个出入度不相等,其他的要保证相等.还有一个条件就是 首尾两个出入度差为1 同时 ...

  9. hdu 1286:找新朋友(数论,欧拉函数)

    找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. Longest Substring Without Repeating Characters - 哈希与双指针

    题意很简单,就是寻找一个字符串中连续的最长包含不同字母的子串. 其实用最朴素的方法,从当前字符开始寻找,找到以当前字符开头的最长子串.这个方法猛一看是个n方的算法,但是要注意到由于字符数目的限制,其实 ...

  2. Web Api Route 注册要放在 Mvc Route 注册前

    今天想研究一下Web Api,写了一个测试Api,打开网站后浏览一下,可是却提示找不到方法,刚开始以为哪里配置错了,可找了半天也没见. 因为我是在一个现有Mvc站点做的Demo,所以打算新建一个Mvc ...

  3. Qt浅译:JSON Support in Qt(JSON只有六种数据类型)

    JSON Support in Qt   Qt5之后开始提供对处理JSON数据的支持,JSON是一种Interter数据交换的数据格式.   JSON 用于存储结构化的数据,JSON有6种基本数据类型 ...

  4. Android 一个改进的okHttp封装库

    一.概述 之前写了篇Android OkHttp完全解析 是时候来了解OkHttp了,其实主要是作为okhttp的普及文章,当然里面也简单封装了工具类,没想到关注和使用的人还挺多的,由于这股热情,该工 ...

  5. Netflix

    2009年Netflix举办了一场Netflix大奖赛.他们公开一批匿名数据,允许参赛团队使用以得出更好的算法.他们从获胜的团队中得到了现有算法10.06%的提升.Netflix本想再举行一场Netf ...

  6. Hadoop Hive与Hbase整合+thrift

    Hadoop Hive与Hbase整合+thrift 1.  简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句 ...

  7. libpng causes error concerning pngconf.h

    Bug Description Ubuntu Gutsy Gibbon 7.10 - libpng 1.2.15~beta5-2ubuntu0.1 (bug probably concerned wi ...

  8. STL 源代码剖析 算法 stl_algo.h -- partition

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie partition ------------------------------------ ...

  9. IT忍者神龟之Java动态代理与CGLib代理

    <br>public class UserDAOImpl{ <br><br>    public void save() { <br>        / ...

  10. 翻页采用jaxa

    <!-- 翻页采用jaxa --><script type="text/javascript">//class="page"下面的a被点 ...