题目链接

题意为求出树上任意点对的距离对3取余的和。

比赛上听到题意就知道是点分治了,但是越写越不对劲,交之前就觉得会T,果不其然T了。修修改改结果队友写了发dp直接就过了Orz。

赛后想了想维护的东西太脑残了,以为像洛谷板子题一样暴力维护就可以,实则被卡死。

赛后的想法是维护距离当前重心的距离对3取余后的距离和以及个数。然后统计的时候枚举两个点的距离取余值,然后统计贡献。

注意下传的时候要消除重复的贡献。

代码丑陋请见谅QAQ

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 3e4 + 15;
 5 const int mod = 1e9 + 7;
 6 struct node {
 7     int s, e, w, next;
 8 }edge[maxn * 2];
 9 int head[maxn], len;
10 void add(int s, int e, int w) {
11     edge[len].e = e;
12     edge[len].w = w;
13     edge[len].next = head[s];
14     head[s] = len++;
15 }
16 int n, root, sum;
17 int vis[maxn], f[maxn], son[maxn];
18 ll ans[4], o[4], num[4];
19 void getroot(int x, int fa) {
20     son[x] = 1, f[x] = 0;
21     for (int i = head[x]; i != -1; i = edge[i].next) {
22         int y = edge[i].e;
23         if (y == fa || vis[y])continue;
24         getroot(y, x);
25         son[x] += son[y];
26         f[x] = max(f[x], son[y]);
27     }
28     f[x] = max(f[x], sum - son[x]);
29     if (f[x] < f[root])root = x;
30 }
31 void getd(int x, int dis, int fa) {
32     o[dis % 3]++;
33     num[dis % 3] += dis;
34     for (int i = head[x]; i != -1; i = edge[i].next) {
35         int y = edge[i].e;
36         if (y == fa || vis[y])continue;
37         getd(y, (dis + edge[i].w) % mod, x);
38     }
39 }
40 void cal(int x, int val, int add) {
41     getd(x, val, 0);
42     for (int i = 0; i < 3; i++)
43         for (int j = 0; j < 3; j++) {
44             ans[(i + j) % 3] = (ans[(i + j) % 3] + o[i] * num[j] * add % mod + mod) % mod;
45             ans[(i + j) % 3] = (ans[(i + j) % 3] + o[j] * num[i] * add % mod + mod) % mod;
46         }
47     for (int i = 0; i < 3; i++)o[i] = num[i] = 0;
48
49
50 }
51 void solve(int x) {
52     cal(x, 0, 1);
53     vis[x] = 1;
54     for (int i = head[x]; i != -1; i = edge[i].next) {
55         int y = edge[i].e;
56         if (vis[y])continue;
57         cal(y, edge[i].w, -1);
58         sum = son[y];
59         root = 0;
60         getroot(y, 0);
61         solve(root);
62     }
63 }
64 int main() {
65     while (scanf("%d", &n) != EOF) {
66         len = 0;
67         for (int i = 0; i <= n + 10; i++)
68             vis[i] = 0, head[i] = -1;
69         for (int i = 1; i < n; i++) {
70             int x, y, z;
71             scanf("%d%d%d", &x, &y, &z);
72             x++, y++;
73             add(x, y, z);
74             add(y, x, z);
75         }
76         for (int i = 0; i < 3; i++)
77             ans[i] = 0;
78         root = 0, f[0] = INT_MAX - 1;
79         sum = n;
80         getroot(1, 0);
81         solve(root);
82         for (int i = 0; i <= 2; i++) {
83             if (i == 2)
84                 printf("%lld\n", ans[i]);
85             else
86                 printf("%lld ", ans[i]);
87         }
88     }
89 }

转载于:https://www.cnblogs.com/sainsist/p/11520254.html

[2019沈阳网络赛D题]Dawn-K's water(点分治)相关推荐

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

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

  2. hdu5455(2015沈阳网络赛F题)

    题意: 给出一个串,问用题中定义的那些串来组成这个串最少要用多少个. 思路: 没啥说的,注意一下输入的串中可能出现除了c和f的字母. 代码: #include<cstdio> #inclu ...

  3. hdu5461(2015沈阳网络赛L题)

    题意: 给出一个数列,我们要在这里找出两个数,使得题意中那个表达式最大. 思路: 排两个序就好了啊,看代码一下就懂了. 代码: #include <cstdio> #include < ...

  4. hdu5452(2015沈阳网络赛C题)

    题意: 给出一个无向图和一个此图的生成树,让我们求一个本图的最小割边集,割边集只包括生成树中的一条边,让割边集的边数最少,输出数目. 思路: 并查集+暴力. 代码: #include<cstdi ...

  5. hdu5459(2015沈阳网络赛J题)

    题意: 给出一个类似于斐波那契数组的字符串的定义,给出一个n,让求第n个串中任意两个c的距离的和. 思路: 我们用了三个小时找规律,最后发现是递推... 代码: #include <cstdio ...

  6. 网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]路由交换部分答案详解

    网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]路由交换部分答案详解 2022年全国职业技能大赛网络系统管理赛项相较2021年再次做出改动,Linux部 ...

  7. 网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]AC/AP/EG部分答案详解

    网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]AC/AP/EG部分答案详解 2022年全国职业技能大赛网络系统管理赛项相较2021年再次做出改动,Li ...

  8. ICPC 2019 徐州网络赛

    ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...

  9. 2019ICPC南京网络赛A题 The beautiful values of the palace(三维偏序)

    2019ICPC南京网络赛A题 The beautiful values of the palace https://nanti.jisuanke.com/t/41298 Here is a squa ...

  10. 2019年电赛D题《简易电路特性测试仪》全过程

    本人为团队中负责硬件部分,为了准备2022年电赛,本队伍已经制作2019年和2021年电赛信号题,本次主要讲解为2019年电赛D题硬件部分,少部分为软件需要做的部分.后续会对整个硬件进行优化和整理. ...

最新文章

  1. 创建并运行HelloWorld Java项目和类
  2. 反编译APK文件的三种方法
  3. 剑指Offer:合并两个排序的链表【25】
  4. JEPaas功能_isEmpty(b.getValue())?“doSave“:“doUpdate“;
  5. Java编程中值得注意的对象引用现象
  6. DataGrip快捷键(执行SQL、格式化SQL)
  7. HDU Fibonacci
  8. Qt汉字显示乱码的一个简单解决方案
  9. java传参方式_Java里方法的参数传递方式
  10. 翻译:响应式编程或反应式编程 RxSwift和RxCocoa 从入门到精通 Reactive programming
  11. 交叉编译及交叉编译工具链的安装
  12. java如何返回一个空数组?
  13. idea 使用markdown总结
  14. 为何iPad 2充电快 但用不了多久?
  15. 解决:AWVS(Acunetix)激活频繁失效(仅供学习)
  16. 3、说说amp;和amp;amp;的区别。
  17. Linux期末考试试题长沙理工,linux操作系统考试试卷(含答案)J
  18. 1688商品sku数据采集方法
  19. Maven打包pom里面配置exclude 排除掉环境相关的配置文件
  20. 【视频教程】Javascript ES6 教程39— ES6 ba

热门文章

  1. DirectX编译环境配置
  2. 学写压缩壳心得系列之一 熟悉概念,未雨绸缪
  3. 最简单爬虫rvest_告别复制粘贴
  4. 趣图:他居然在前端写业务逻辑!
  5. 如何成为一名卓越的数据科学家-桃树七剑之二:数据准备
  6. 一、公安备案与经营性备案
  7. Requests库常用方法及其详解
  8. Eclipse srever起来时,时间超过45s。
  9. 《算法竞赛入门经典》习题及反思 -2
  10. DisplayX显示器测试、显示器屏幕检测