这题看了三个月,终于过了,第一次看的时候没学树形DP,想用点分治但是不会

后来学了二次扫描,就有点想法了。。。。

这东西也真就玄学了吧。。。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<vector>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. const int maxn = 1e5 + 7;
  8. const ll mod = 1e9 + 7;
  9. struct Node {
  10. int p;
  11. ll len;
  12. Node(int _p, ll _len) :p(_p), len(_len) {}
  13. };
  14. int n;
  15. ll dp[maxn][5];
  16. ll cnt[maxn][6];
  17. vector<Node>G[maxn];
  18. void insert(int be, int en, ll len) {
  19. G[be].push_back(Node(en, len));
  20. }
  21. int dfs2(int x, int fa) {
  22. for (int i = 0; i < G[x].size(); i++) {
  23. int p = G[x][i].p;
  24. ll len = G[x][i].len;
  25. if (p == fa) continue;
  26. dfs2(p, x);
  27. for (int a = 0; a < 3; a++) {
  28. dp[x][(a + len) % 3] += (dp[p][a] + cnt[p][a] * len) % mod;
  29. cnt[x][(a + len) % 3] += cnt[p][a];
  30. dp[x][(a + len) % 3] %= mod;
  31. }
  32. dp[x][len % 3] += len;
  33. dp[x][len % 3] %= mod;
  34. cnt[x][len % 3] ++;
  35. }
  36. return 0;
  37. }
  38. ll ans[10];
  39. ll son[10];
  40. int dfs(int x, int fa) {
  41. for (int i = 0; i < G[x].size(); i++) {
  42. int p = G[x][i].p;
  43. ll len = G[x][i].len;
  44. if (p == fa) continue;
  45.  
  46. for (int a = 0; a < 3; a++) {
  47. ans[(a + len) % 3] = (dp[x][(a + len) % 3] - (cnt[p][a] * len + dp[p][a])) % mod;
  48.  
  49. ans[(a + len) % 3] += mod;
  50. ans[(a + len) % 3] %= mod;
  51. son[(a + len) % 3] = cnt[x][(a + len) % 3] - cnt[p][a];
  52. }
  53. son[len % 3]--;
  54. ans[len % 3] = (ans[len % 3] - len + mod) % mod;
  55.  
  56. //删除了多的边
  57. for (int a = 0; a < 3; a++) {
  58. dp[p][(a + len) % 3] += (ans[a] + son[a] * len) % mod;
  59. dp[p][(a + len) % 3] %= mod;
  60. cnt[p][(a + len) % 3] += son[a];
  61. }
  62. cnt[p][len % 3]++;
  63. dp[p][len % 3] += len;
  64. dp[p][len % 3] %= mod;
  65.  
  66. dfs(p, x);
  67. }
  68. return 0;
  69. }
  70. int main() {
  71. while (~scanf("%d", &n)) {
  72. for (int i = 0; i <= n; i++) G[i].clear();
  73. memset(dp, 0, sizeof(dp));
  74. memset(cnt, 0, sizeof(cnt));
  75. int be, en;
  76. ll len;
  77. for (int i = 1; i < n; i++) {
  78. scanf("%d %d %lld", &be, &en, &len);
  79. insert(be, en, len);
  80. insert(en, be, len);
  81. }
  82. dfs2(0, -1);
  83. dfs(0, -1);
  84.  
  85. ll a = 0, b = 0, c = 0;
  86. for (int i = 0; i < n; i++) {
  87. a = (a + dp[i][0]) % mod;
  88. b = (b + dp[i][1]) % mod;
  89. c = (c + dp[i][2]) % mod;
  90. }
  91. printf("%lld %lld %lld\n", a, b, c);
  92. }
  93. return 0;
  94. }

  

2019 沈阳网络赛 Fish eating fruit的更多相关文章

  1. 2019ICPC沈阳网络赛-D-Fish eating fruit(树上DP, 换根, 点分治)

    链接: https://nanti.jisuanke.com/t/41403 题意: State Z is a underwater kingdom of the Atlantic Ocean. Th ...

  2. 2019 沈阳网络赛 D Fish eating fruit ( 树形DP)

    题目传送门 题意:求一颗树中所有点对(a,b)的路径长度,路径长度按照模3之后的值进行分类,最后分别求每一类的和 分析:树形DP \(dp[i][j]\) 表示以 i 为根的子树中,所有子节点到 i ...

  3. 2019沈阳网络赛B.Dudu's maze

    https://www.cnblogs.com/31415926535x/p/11520088.html 啊,,不在状态啊,,自闭一下午,,都错题,,然后背锅,,,明明这个简单的题,,, 这题题面不容 ...

  4. [2019沈阳网络赛D题]Dawn-K's water(点分治)

    题目链接 题意为求出树上任意点对的距离对3取余的和. 比赛上听到题意就知道是点分治了,但是越写越不对劲,交之前就觉得会T,果不其然T了.修修改改结果队友写了发dp直接就过了Orz. 赛后想了想维护的东 ...

  5. 【2019沈阳网络赛】G、Special necklace——自闭的物理题

    这道题让我差点怀疑自己高考没考过物理 题意中 he measures the resistance of any two endpoints of it, the resistance values ...

  6. 2019沈阳网赛树形dp

    https://nanti.jisuanke.com/t/41403 2019沈阳网络赛D题 树形dp.一棵树,求任意两个点的距离之和.u-v和v-u算两次.两点之间的距离分为三类,模3等于0,1,2 ...

  7. Fish eating fruit 沈阳网络赛(树形dp)

    Fish eating fruit \[ Time Limit: 1000 ms \quad Memory Limit: 262144 kB \] 题意 大体的题意就是给出一棵树,求每一对点之间的距离 ...

  8. 2018 ICPC 沈阳网络赛

    2018 ICPC 沈阳网络赛 Call of Accepted 题目描述:求一个算式的最大值与最小值. solution 按普通算式计算方法做,只不过要同时记住最大值和最小值而已. Convex H ...

  9. 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)

    题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...

随机推荐

  1. 前端基础☞CSS

    css的四种引入方式 1.行内式 行内式是在标记的style属性中设定CSS样式.这种方式没有体现出CSS的优势,不推荐使用. <p style="background-color: ...

  2. 使用Laravel5做权限管理

    https://www.imooc.com/article/18250 关于权限管理的思考 最近在用laravel设计后台,后台需要有个权限管理.权限管理实质上分为两个部分,首先是认证,然后是权限.认 ...

  3. 解决ArcMap绘图错误

    这几天在用ArcMap对shapefile做矢量化的过程中,遇到一件特别蛋疼的事,ArcMap竟然会出现绘图错误.如下所示: 纠结了许久之后,终于在Esri社区找到了解决办法:帮助文档中说 “检查属性 ...

  4. JVM 调优 —— GC 长时间停顿问题及解决方法

    零. 简介 垃圾收集器长时间停顿,表现在 Web 页面上可能是页面响应码 500 之类的服务器错误问题,如果是个支付过程可能会导致支付失败,将造成公司的直接经济损失,程序员要尽量避免或者说减少此类情况 ...

  5. 2019-8-31-dotnet-使用-MessagePack-序列化对象

    title author date CreateTime categories dotnet 使用 MessagePack 序列化对象 lindexi 2019-08-31 16:55:58 +080 ...

  6. offsetheight 和clientheight、scrollheight、scrollTop区别

    clientHeight:元素客户区的大小,指的是元素内容及其边框所占据的空间大小(经过实践取出来的大多是视口大小) scrollHeight: 滚动大小,指的是包含滚动内容的元素大小(元素内容的总高 ...

  7. List of open source software

    List of open source software https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/ ...

  8. RequestMapping中produces属性作用

    注解RequestMapping中produces属性可以设置返回数据的类型以及编码,可以是json或者xml: @RequestMapping(value="/xxx",prod ...

  9. 2018-10-15-Winforms-可能遇到的-1000-个问题

    title author date CreateTime categories Winforms 可能遇到的 1000 个问题 lindexi 2018-10-15 09:35:15 +0800 20 ...

  10. C++第三次作业:友元类

    友元类 将数据与处理数据的函数封装在一起,构成类,即实现了数据的共享又实现了隐藏,无疑是面向程序设计的一大优点,但是封装并不总是完美的,一旦需要涉及到一个类的两个对象的数据处理问题该怎么办?无论是设计 ...