意甲冠军:

long long ans = 0;

for(int i = 1; i <= n; i++)

for(int j = i+1; j <= n; j++)

ans += F(i,j);

F(i,j)表示i点到j点路径上全部的点权和。

若i->j路径上存在2条相邻边边权同样则 F(i,j) = 0

问:ans的值。

int乘法爆掉了我也醉了。

。。

思路:

和网上的统计边方法不同,这里是用统计点出现的次数来计算

我们计算每一个点i 出现的次数,则答案就是 i的次数*i的点权 => dp[i] * a[i]

而i出现的路径起点和终点有4种

1、i的子孙->i的子孙

2、i的子孙->i

3、i到 (非i的子孙( 即i的祖先节点,兄弟节点和兄弟节点的子孙

4、i的子孙->非i的子孙

所以先计算1,2的情况 ,用dp1[i]记录

3,4的情况用dp2[i]记录

则答案就是 for(int i = 1; i <= n; i++) ans += a[i] * (dp1[i]+dp2[i]);

siz[u] 表示以u为根的子树中有效的节点数,若 u -> v(col = 1) && v -> k(col=1), 则以k为根的子树都不是有效节点

(当中v是u的儿子,k是v的儿子)

mp[u][col]表示以u为根。有效节点中 用颜色为col的边相连的节点个数

  1. #include <map>
  2. using namespace std;
  3. #define N 300100
  4. struct Edge{
  5. int to, col, nex;
  6. }edge[N<<1];
  7. int head[N], edgenum;
  8. void init(){memset(head, -1, sizeof head); edgenum = 0;}
  9. void add(int u, int v, int col){
  10. Edge E = {v, col, head[u]};
  11. edge[edgenum] = E;
  12. head[u] = edgenum++;
  13. }
  14. typedef long long ll;
  15. template <class T>
  16. inline bool rd(T &ret) {
  17. char c; int sgn;
  18. if(c=getchar(),c==EOF) return 0;
  19. while(c!='-'&&(c<'0'||c>'9')) c=getchar();
  20. sgn=(c=='-')?-1:1;
  21. ret=(c=='-')?0:(c-'0');
  22. while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
  23. ret*=sgn;
  24. return 1;
  25. }
  26. template <class T>
  27. inline void pt(T x) {
  28. if(x>9) pt(x/10);
  29. putchar(x%10+'0');
  30. }
  31. int n, k;
  32. ll dp1[N], dp2[N], a[N];
  33. int siz[N];
  34. map<int, int> mp[N], mp2[N];//mp[u][col]表示u子树下 边颜色=col 的有效的点数
  35. void dfs1(int u, int fa){
  36. siz[u] = 0; dp1[u] = 0;
  37. for(int i = head[u]; ~i; i = edge[i].nex) {
  38. int v = edge[i].to; if(v == fa)continue;
  39. dfs1(v, u);
  40. mp[u][edge[i].col] += siz[v] - mp[v][edge[i].col];
  41. siz[u] += siz[v] - mp[v][edge[i].col];
  42. }
  43. ll dou = 0;
  44. for(int i = head[u]; ~i; i = edge[i].nex) {
  45. int v = edge[i].to; if(v == fa)continue;
  46. dou += (ll)(siz[v] - mp[v][edge[i].col]) * (ll)(siz[u] - mp[u][edge[i].col]);
  47. dp1[u] += siz[v] - mp[v][edge[i].col];
  48. }
  49. dp1[u] += dou >> 1;
  50. siz[u]++;
  51. }
  52. void dfs2(int u, int ok, int col, int fa) {
  53. dp2[u] = (ll)(siz[u] - mp[u][col]) * (ll)ok;
  54. for(int i = head[u]; ~i; i = edge[i].nex) {
  55. int v = edge[i].to; if(v == fa)continue;
  56. if(u != fa && edge[i].col == col)
  57. dfs2(v, siz[u] - mp[u][edge[i].col], edge[i].col, u);
  58. else
  59. dfs2(v, ok + siz[u] - mp[u][edge[i].col], edge[i].col, u);
  60. }
  61. }
  62. void solve(){
  63. init();
  64. for(int i = 1; i <= n; i++)rd(a[i]), mp[i].clear(), mp2[i].clear();
  65. for(int i = 1, u, v, d; i < n; i++) {
  66. rd(u);rd(v);rd(d);
  67. add(u,v,d); add(v,u,d);
  68. }
  69. dfs1(1, 1);
  70. dfs2(1, 0, -1, 1);
  71. }
  72. int main() {
  73. while(rd(n)){
  74. solve();
  75. ll ans = 0;
  76. for(int i = 1; i <= n; i++)
  77. ans += a[i]*(dp1[i]+dp2[i]);
  78. pt( ans );putchar('\n');
  79. }
  80. return 0;
  81. }
  82. /*
  83. 4
  84. 1 10 100 1000
  85. 1 2 1
  86. 2 3 1
  87. 3 4 1
  88.  
  89. 5
  90. 1 10 100 1000 10000
  91. 1 2 1
  92. 2 3 1
  93. 3 4 1
  94. 2 5 2
  95.  
  96. 11
  97. 1 2 3 4 5 6 7 8 9 111 123
  98. 1 2 1
  99. 1 3 2
  100. 2 4 3
  101. 2 5 1
  102. 3 6 3
  103. 3 7 3
  104. 5 8 1
  105. 5 9 2
  106. 8 10 1
  107. 11 8 2
  108.  
  109. 14
  110. 1 2 3 4 5 6 7 8 9 111 123 235 66 1000
  111. 1 2 1
  112. 1 3 2
  113. 2 4 3
  114. 2 5 1
  115. 3 6 3
  116. 3 7 3
  117. 5 8 1
  118. 5 9 2
  119. 8 10 1
  120. 11 8 2
  121. 12 11 2
  122. 8 13 1
  123. 8 14 2
  124.  
  125. 10
  126. 1 1 1 1 1 1 1 1 1 1
  127. 1 2 1
  128. 1 7 1
  129. 1 10 2
  130. 2 3 5
  131. 2 6 4
  132. 3 4 1
  133. 3 5 8
  134. 7 8 2
  135. 7 9 1
  136.  
  137. 14
  138. 1 2 5 10 20 30 70 80 100 1000 2000 5000 100000 1000000
  139. 1 2 2
  140. 1 3 1
  141. 1 4 1
  142. 2 5 2
  143. 2 8 3
  144. 3 9 3
  145. 3 6 2
  146. 4 7 1
  147. 4 10 3
  148. 3 11 3
  149. 6 12 2
  150. 13 1 2
  151. 14 3 3
  152.  
  153. */

版权声明:本文博客原创文章,博客,未经同意,不得转载。

HDU 4303 Hourai Jeweled 树dp 所有权利和航点 dfs2次要的更多相关文章

  1. HDU 4303 Hourai Jeweled 解题报告

    HDU 4303 Hourai Jeweled 解题报告 评测地址: http://acm.hdu.edu.cn/showproblem.php?pid=4303 评测地址: https://xoj. ...

  2. HDU 4303 Hourai Jeweled(树形DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4303 题意:给出一棵树,树上的每一个节点都有一个权值,每条边有一个颜色,如果一条路径上相邻边的颜色都是不同的,那 ...

  3. HDU 1011 Starship Troopers (树dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意: 题目大意是有n个房间组成一棵树,你有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个 ...

  4. HDU 4661 Message Passing ( 树DP + 推公式 )

    参考了: http://www.cnblogs.com/zhsl/archive/2013/08/10/3250755.html http://blog.csdn.net/chaobaimingtia ...

  5. HDU 4085 斯坦纳树+DP

    https://cn.vjudge.net/problem/HDU-4085 给你n,m,k ,分别表示有n个点,m条边,每条边有一个权值,表示修复这条边需要的代价 从前k个点中任取一个使其和后k个点 ...

  6. HDU 4303 树形DP

    Hourai Jeweled Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 163840/163840 K (Java/Others) ...

  7. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  8. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  9. HDU 2196 Computer (树dp)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 给你n个点,n-1条边,然后给你每条边的权值.输出每个点能对应其他点的最远距离是多少 ...

随机推荐

  1. React Native是一套使用 React 构建 Native app 的编程框架

    React Native是一套使用 React 构建 Native app 的编程框架 React Native at first sight what is React Native? 跟据官方的描 ...

  2. 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

    原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 提供者模式(Provider Pattern) 作者:weba ...

  3. Effective C++ Item 32 确保你的 public 继承模子里出来 is-a 关联

    本文senlie原版的,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:"public继承"意味 is-a.适用于 base classe ...

  4. Directx11学习笔记【九】 【转】 3D渲染管线

    原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即给定场景的描述,包括各个物体的材质.纹理.坐标等,照相 ...

  5. 联想昭阳e43l笔记本配置

    驱动精灵硬件检测报告 版本:2015.3.26.1363(8.1.326.1363)========================================================== ...

  6. HDU 1085-Holding Bin-Laden Captive!(生成功能)

    Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...

  7. AutoMapper在ABP框架

    AutoMapper在ABP框架中的使用说明 为了说明AutoMapper如何使用,我专门开设了一个专题来讲,如果您还没有查看该专题,请点击这里.既然系统地学习了AutoMapper,那么接下来就是该 ...

  8. iOS当该装置是水平屏,frame和bounds分别

    project那里有两个ViewControllers.间ViewController它是root view controller,红色背景,有一个顶button,点击加载后GreenViewCont ...

  9. HDU 4896 Minimal Spanning Tree(矩阵高速功率)

    意甲冠军: 给你一幅这样子生成的图,求最小生成树的边权和. 思路:对于i >= 6的点连回去的5条边,打表知907^53 mod 2333333 = 1,所以x的循环节长度为54,所以9个点为一 ...

  10. 【C++知识汇总】运营商 &amp; 运算符重载

    [运算符]        在进行运算时,假设右括号的话我们知道先运算哪个,那假设没有括号了.算术运算符,关系运算符,逻辑运算符,位运算符.赋值运算符,++.--运算符等等,那么多的运算符.我们先算哪边 ...