题意:一棵树,俩种操作:1 有路径上的全部点加vi,2全部边加vi。

先离线求出全部询问的lca,再遍历询问一次,点+vi,lca-2*vi ,最后dfs从叶子扫上来一次,最后再祖先点补上就可以。用了输入挂。

复杂度(n+m).

  1. #pragma comment(linker,"/STACK:10240000000000,10240000000000")
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. using namespace std;
  6. const int maxv=100005,maxe=200015;
  7. int head[maxv];int nume=0;long long e[maxe][3];
  8. void inline adde(int i,int j) //边
  9. {
  10. e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;
  11. e[nume++][2]=0;
  12. e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;
  13. e[nume++][2]=0;
  14. }
  15. int headq[maxv];int numq=0;long long q[maxe][5];
  16. void inline addq(int x,int y,long long vals,int flag) //询问
  17. {
  18. q[numq][0]=y;q[numq][1]=headq[x];headq[x]=numq;
  19. q[numq][2]=-1;q[numq][3]=vals;q[numq++][4]=flag;
  20. q[numq][0]=x;q[numq][1]=headq[y];headq[y]=numq;
  21. q[numq][2]=-1;q[numq][3]=vals;q[numq++][4]=flag;
  22. }
  23. int fa[maxv];
  24. int find(int x)
  25. {
  26. if(x!=fa[x])
  27. return fa[x]=find(fa[x]);
  28. return fa[x];
  29. }
  30. int ve[maxv];
  31. int n,m;
  32. int vis[maxv];int vis2[maxv];
  33. long long val[maxv];
  34. int ise[maxe];
  35. void tarjan(int u,int father) //离线求lca
  36. {
  37. for(int j=head[u];j!=-1;j=e[j][1])
  38. {
  39. int v=e[j][0];
  40. if(!vis[v]&&v!=father)
  41. {
  42. ve[v]=j;
  43. ise[j]=1;
  44. tarjan(v,u);
  45. fa[v]=u;
  46. }
  47. }
  48. vis[u]=1;
  49. for(int j=headq[u];j!=-1;j=q[j][1])
  50. {
  51. if(vis[q[j][0]])
  52. {
  53. q[j^1][2]=q[j][2]=find(q[j][0]);
  54. }
  55. }
  56. }
  57. void dfs(int u) //求出全部点边情况
  58. {
  59. for(int j=head[u];j!=-1;j=e[j][1])
  60. {
  61. int v=e[j][0];
  62. if(!vis2[v])
  63. {
  64. vis2[v]=1;
  65. dfs(v);
  66. val[u]+=val[v];
  67. e[ve[u]][2]+=e[ve[v]][2];
  68. }
  69. }
  70. }
  71. int vis_e[maxe];
  72. long long anster[maxv];
  73. void init()
  74. {
  75. nume=numq=0;
  76. for(int i=0;i<maxv;i++)
  77. {
  78. head[i]=headq[i]=-1;
  79. fa[i]=i;
  80. val[i]=vis2[i]=vis[i]=0;
  81. ve[i]=2*n;
  82. anster[i]=0;
  83. }
  84. for(int i=0;i<maxe;i++)
  85. {
  86. ise[i]=0;
  87. vis_e[i]=0;
  88. }
  89. }
  90. template <class T> //输入挂
  91. inline bool scan(T &ret) {
  92. char c; int sgn;
  93. if(c=getchar(),c==EOF) return 0; //EOF
  94. while(c!='-'&&(c<'0'||c>'9')) c=getchar();
  95. sgn=(c=='-')?-1:1;
  96. ret=(c=='-')?0:(c-'0');
  97. while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
  98. ret*=sgn;
  99. return 1;
  100. }
  101. /*inline void prints(long long x) {
  102. if(x>9) prints(x/10);
  103. putchar(x%10+'0');
  104. }*/
  105. int main()
  106. {
  107. int T;int cnt=1;
  108. scan(T);
  109. //scanf("%d",&T);
  110. while(T--)
  111. {
  112. //scanf("%d%d",&n,&m);
  113. scan(n);scan(m);
  114. init();
  115. int aa,bb,cc;
  116. for(int i=0;i<n-1;i++)
  117. {
  118. // scanf("%d%d",&aa,&bb);
  119. scan(aa);scan(bb);
  120. adde(aa,bb);
  121. }
  122. int tx;
  123. for(int i=0;i<m;i++)
  124. {
  125.  
  126. getchar();getchar();getchar();//getchar();
  127. //scanf("ADD");
  128. scan(tx);
  129. scan(aa);scan(bb);scan(cc);
  130. // scanf("%d%d%d%d",&tx,&aa,&bb,&cc);
  131. if(tx==1)
  132. addq(aa,bb,cc,1);
  133. else
  134. addq(aa,bb,cc,0);
  135. }
  136. tarjan(n/2+1,-1);
  137. for(int i=1;i<=n;i++)
  138. for(int j=headq[i];j!=-1;j=q[j][1])
  139. {
  140. if(!vis_e[j])
  141. {
  142. vis_e[j]=vis_e[j^1]=1;
  143. if(q[j][4])
  144. {
  145. val[i]+=q[j][3];
  146. val[q[j][0]]+=q[j][3];
  147. val[q[j][2]]-=q[j][3]*2;
  148. anster[q[j][2]]+=q[j][3];
  149. }
  150. else
  151. {
  152. e[ve[i]][2]+=q[j][3];
  153. e[ve[q[j][0]]][2]+=q[j][3];
  154. e[ve[q[j][2]]][2]-=2*q[j][3];
  155. }
  156. }
  157. }
  158. vis2[n/2+1]=1;
  159. dfs(n/2+1);
  160. printf("Case #%d:\n",cnt++);
  161. for(int i=1;i<n;i++)
  162. printf("%I64d ",val[i]+anster[i]);
  163. printf("%I64d\n",val[n]+anster[n]);
  164. for(int j=0;j<nume;j++)
  165. if(ise[j])
  166. {
  167. if(j==nume-2||j==nume-1)printf("%I64d",e[j][2]);
  168. else printf("%I64d ",e[j][2]);
  169. }
  170. puts("");
  171. }
  172. return 0;
  173. }

hdu 5044 树区间操作最后输出/ lca+dfs的更多相关文章

  1. HDU 4578——Transformation——————【线段树区间操作、确定操作顺序】

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  2. POJ 3225 Help with Intervals --线段树区间操作

    题意:给你一些区间操作,让你输出最后得出的区间. 解法:区间操作的经典题,借鉴了网上的倍增算法,每次将区间乘以2,然后根据区间开闭情况做微调,这样可以有效处理开闭区间问题. 线段树维护两个值: cov ...

  3. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...

  4. 吉首大学校赛 K 白山茶与红玫瑰 (线段树区间操作)

    链接:https://ac.nowcoder.com/acm/contest/925/K来源:牛客网 题目描述 公元2019年6月22日,白山茶王国与红玫瑰王国展开大战,在世外仙境——天空花园处,双方 ...

  5. POJ 2528 ——Mayor's posters(线段树+区间操作)

    Time limit 1000 ms Memory limit 65536 kB Description The citizens of Bytetown, AB, could not stand t ...

  6. HDU - 6315(2018 Multi-University Training Contest 2) Naive Operations (线段树区间操作)

    http://acm.hdu.edu.cn/showproblem.php?pid=6315 题意 a数组初始全为0,b数组为1-n的一个排列.q次操作,一种操作add给a[l...r]加1,另一种操 ...

  7. hdu 4902 Nice boat(线段树区间改动,输出终于序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 Problem Description There is an old country and ...

  8. L - Vases and Flowers - hdu 4614(区间操作)

    题意:有两种操作,第一种从A开始插花,如果有花就跳到下一个,然后输出最后一个花瓶的编号,如果花瓶不够把多余的花丢掉.操作2把区间清空 分析:很明显的线段树操作,就是插花的时候麻烦一下,需要先找出来他剩 ...

  9. 线段树(区间操作) POJ 3325 Help with Intervals

    题目传送门 题意:四种集合的操作,对应区间的01,问最后存在集合存在的区间. 分析:U T [l, r]填充1; I T [0, l), (r, N]填充0; D T [l, r]填充0; C T[0 ...

随机推荐

  1. 使用perldoc阅读perl文档

    perl在安装的时候,就给我们送上一份大礼,组织精美,解释详细的perl百科全书已经安装在你的电脑里面了,遇到问题不要在去搜索那些博客了,还是练练英文,看看perldoc吧,呵呵. 1.用perldo ...

  2. Linux下C++连MySQL数据库

    1.查看本地有没有安装mysql,命令就是mysql,如果有这个命令就表示安装了mysql数据库软件.如果没有就自行安装. MySQL-server-4.0.16-0.i386.rpm MySQL-c ...

  3. JSP页面最终是编译为Servlet执行的

    JSP页面最终是编译为Servlet执行的,你可以在Tomcat的%CATALINA_HOME%/work/Catalina/localhost中找到一个文件夹,该文件夹跟你的web-project的 ...

  4. 在Eclipse中给JRE-Library添加本地Javadoc

    Eclipse中的JRE-Library的Javadoc默认是一个URL,指向oracle的一个web-page,那你在离线的时候就无法使用了,为了解决这个问题,你可以从oracle下载JDK-Spe ...

  5. spring报错:Caused by: java.lang.IllegalStateException: Cannot convert value of type for property : no matching editors or conversion strategy found

    原因分析:是因为类返回的类型跟期望的类型没有继承关系,返回的类型就SqlMapClient,它是通过实现了FactoryBean<SqlMapClient>接口的SqlMapClientF ...

  6. C++14尝鲜:Generic Lambdas(泛型lambda)

    所谓泛型lambda.就是在形參声明中使用auto类型指示说明符的lambda. 比方 auto lambda = [](auto x, auto y) {return x + y;}; 依据C++1 ...

  7. 【C#/WPF】Button按钮动态设置Background背景颜色

    学习笔记: 在XAML中给Button设置颜色大家都懂的,本篇只是记录用C#代码动态生成的按钮设置Background背景颜色. new一个Button,设置Background时可看到该属性类型是S ...

  8. 利用GDB对程序进行调试

    第一章初涉调试会话 调试工具 GDB,Unix下最常用的调试工具 DDD,基于GUI的调试器,大多数工具都是GDB的GUI前端. Eclipse,IDE也是一种调试工具 atoi( )把字符串变为整数 ...

  9. C语言 · 寂寞的数

    算法训练 寂寞的数   时间限制:1.0s   内存限制:256.0MB      问题描述 道德经曰:一生二,二生三,三生万物. 对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和 ...

  10. C语言 · 求指数

    算法训练 5-2求指数   时间限制:1.0s   内存限制:256.0MB      问题描述 已知n和m,打印n^1,n^2,...,n^m.要求用静态变量实现.n^m表示n的m次方.已知n和m, ...