[2019沈阳网络赛D题]Dawn-K's water(点分治)
题目链接
题意为求出树上任意点对的距离对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(点分治)相关推荐
- 2019沈阳网络赛B.Dudu's maze
https://www.cnblogs.com/31415926535x/p/11520088.html 啊,,不在状态啊,,自闭一下午,,都错题,,然后背锅,,,明明这个简单的题,,, 这题题面不容 ...
- hdu5455(2015沈阳网络赛F题)
题意: 给出一个串,问用题中定义的那些串来组成这个串最少要用多少个. 思路: 没啥说的,注意一下输入的串中可能出现除了c和f的字母. 代码: #include<cstdio> #inclu ...
- hdu5461(2015沈阳网络赛L题)
题意: 给出一个数列,我们要在这里找出两个数,使得题意中那个表达式最大. 思路: 排两个序就好了啊,看代码一下就懂了. 代码: #include <cstdio> #include < ...
- hdu5452(2015沈阳网络赛C题)
题意: 给出一个无向图和一个此图的生成树,让我们求一个本图的最小割边集,割边集只包括生成树中的一条边,让割边集的边数最少,输出数目. 思路: 并查集+暴力. 代码: #include<cstdi ...
- hdu5459(2015沈阳网络赛J题)
题意: 给出一个类似于斐波那契数组的字符串的定义,给出一个n,让求第n个串中任意两个c的距离的和. 思路: 我们用了三个小时找规律,最后发现是递推... 代码: #include <cstdio ...
- 网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]路由交换部分答案详解
网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]路由交换部分答案详解 2022年全国职业技能大赛网络系统管理赛项相较2021年再次做出改动,Linux部 ...
- 网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]AC/AP/EG部分答案详解
网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]AC/AP/EG部分答案详解 2022年全国职业技能大赛网络系统管理赛项相较2021年再次做出改动,Li ...
- ICPC 2019 徐州网络赛
ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...
- 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 ...
- 2019年电赛D题《简易电路特性测试仪》全过程
本人为团队中负责硬件部分,为了准备2022年电赛,本队伍已经制作2019年和2021年电赛信号题,本次主要讲解为2019年电赛D题硬件部分,少部分为软件需要做的部分.后续会对整个硬件进行优化和整理. ...
最新文章
- 创建并运行HelloWorld Java项目和类
- 反编译APK文件的三种方法
- 剑指Offer:合并两个排序的链表【25】
- JEPaas功能_isEmpty(b.getValue())?“doSave“:“doUpdate“;
- Java编程中值得注意的对象引用现象
- DataGrip快捷键(执行SQL、格式化SQL)
- HDU Fibonacci
- Qt汉字显示乱码的一个简单解决方案
- java传参方式_Java里方法的参数传递方式
- 翻译:响应式编程或反应式编程 RxSwift和RxCocoa 从入门到精通 Reactive programming
- 交叉编译及交叉编译工具链的安装
- java如何返回一个空数组?
- idea 使用markdown总结
- 为何iPad 2充电快 但用不了多久?
- 解决:AWVS(Acunetix)激活频繁失效(仅供学习)
- 3、说说amp;和amp;amp;的区别。
- Linux期末考试试题长沙理工,linux操作系统考试试卷(含答案)J
- 1688商品sku数据采集方法
- Maven打包pom里面配置exclude 排除掉环境相关的配置文件
- 【视频教程】Javascript ES6 教程39— ES6 ba