[2019沈阳网络赛D题]Dawn-K's water(点分治)
题意为求出树上任意点对的距离对3取余的和。
比赛上听到题意就知道是点分治了,但是越写越不对劲,交之前就觉得会T,果不其然T了。修修改改结果队友写了发dp直接就过了Orz。
赛后想了想维护的东西太脑残了,以为像洛谷板子题一样暴力维护就可以,实则被卡死。
赛后的想法是维护距离当前重心的距离对3取余后的距离和以及个数。然后统计的时候枚举两个点的距离取余值,然后统计贡献。
注意下传的时候要消除重复的贡献。
代码丑陋请见谅QAQ
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e4 + ;
const int mod = 1e9 + ;
struct node {
int s, e, w, next;
}edge[maxn * ];
int head[maxn], len;
void add(int s, int e, int w) {
edge[len].e = e;
edge[len].w = w;
edge[len].next = head[s];
head[s] = len++;
}
int n, root, sum;
int vis[maxn], f[maxn], son[maxn];
ll ans[], o[], num[];
void getroot(int x, int fa) {
son[x] = , f[x] = ;
for (int i = head[x]; i != -; i = edge[i].next) {
int y = edge[i].e;
if (y == fa || vis[y])continue;
getroot(y, x);
son[x] += son[y];
f[x] = max(f[x], son[y]);
}
f[x] = max(f[x], sum - son[x]);
if (f[x] < f[root])root = x;
}
void getd(int x, int dis, int fa) {
o[dis % ]++;
num[dis % ] += dis;
for (int i = head[x]; i != -; i = edge[i].next) {
int y = edge[i].e;
if (y == fa || vis[y])continue;
getd(y, (dis + edge[i].w) % mod, x);
}
}
void cal(int x, int val, int add) {
getd(x, val, );
for (int i = ; i < ; i++)
for (int j = ; j < ; j++) {
ans[(i + j) % ] = (ans[(i + j) % ] + o[i] * num[j] * add % mod + mod) % mod;
ans[(i + j) % ] = (ans[(i + j) % ] + o[j] * num[i] * add % mod + mod) % mod;
}
for (int i = ; i < ; i++)o[i] = num[i] = ; }
void solve(int x) {
cal(x, , );
vis[x] = ;
for (int i = head[x]; i != -; i = edge[i].next) {
int y = edge[i].e;
if (vis[y])continue;
cal(y, edge[i].w, -);
sum = son[y];
root = ;
getroot(y, );
solve(root);
}
}
int main() {
while (scanf("%d", &n) != EOF) {
len = ;
for (int i = ; i <= n + ; i++)
vis[i] = , head[i] = -;
for (int i = ; i < n; i++) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
x++, y++;
add(x, y, z);
add(y, x, z);
}
for (int i = ; i < ; i++)
ans[i] = ;
root = , f[] = INT_MAX - ;
sum = n;
getroot(, );
solve(root);
for (int i = ; i <= ; i++) {
if (i == )
printf("%lld\n", ans[i]);
else
printf("%lld ", ans[i]);
}
}
}
[2019沈阳网络赛D题]Dawn-K's water(点分治)的更多相关文章
- ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval
ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...
- ACM-ICPC 2019南昌网络赛F题 Megumi With String
ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...
- 【2019沈阳网络赛】G、Special necklace——自闭的物理题
这道题让我差点怀疑自己高考没考过物理 题意中 he measures the resistance of any two endpoints of it, the resistance values ...
- 2019沈阳网络赛B.Dudu's maze
https://www.cnblogs.com/31415926535x/p/11520088.html 啊,,不在状态啊,,自闭一下午,,都错题,,然后背锅,,,明明这个简单的题,,, 这题题面不容 ...
- 2019上海网络赛B题(差分 + 离散化 or 差分 + 思维)
这题.....队里都没怎么训练差分,导致败北...写了一堆线段树嘤嘤嘤,到最后也是超时,比赛结束后看到了差分的思想于是就去学了一手. 其实了解差分思想的一眼就能看出来是差分了.但是如果对n差分的话很明 ...
- [2019上海网络赛F题]Rhyme scheme
题目链接 题意,求出合法的长度为n的字典序第k小字符串,合法的定义为除了最后一位,每一位的取值范围为'A'到'A'+pos-1,而最后一位的取值范围'A'到当前字符串最大值+1. 队友tql,Orz ...
- [2019南京网络赛D题]Robots
题目链接 2019.9.2更新 第二天睡醒想了想发现好像搜一遍就可以过,赛时写的花里胡哨的还错了,太菜了QAQ #include<bits/stdc++.h> using namespac ...
- 2019 沈阳网络赛 Fish eating fruit
这题看了三个月,终于过了,第一次看的时候没学树形DP,想用点分治但是不会 后来学了二次扫描,就有点想法了.... 这东西也真就玄学了吧... #include<iostream> #inc ...
- 2019 沈阳网络赛 D Fish eating fruit ( 树形DP)
题目传送门 题意:求一颗树中所有点对(a,b)的路径长度,路径长度按照模3之后的值进行分类,最后分别求每一类的和 分析:树形DP \(dp[i][j]\) 表示以 i 为根的子树中,所有子节点到 i ...
随机推荐
- #python#return和print的一些理解
https://www.jianshu.com/p/18a6c0c76438 代码 (1) ++++++++++++++++++++++++++++++++++ x = 1y = 2def add ( ...
- 数据库基本概念及Oracle基本语句
一.数据库分类 通常是按照数据模型的特点将传统数据库系统分成网状数据库.层次数据库和关系数据库三种. 1.网状数据库 顾名思义,网状数据库采用的是以记录类型为结点的网状数据模型,是一种导航式(Navi ...
- 简单配置prometheus
一,物理节点安装配置(简单配置,未涉及报警及grafana图形展示) 1,prometheus 官网下载安装 下载安装 # pwd /usr/local/src https://github.com/ ...
- java-webuploader+Java如何实现分片+断点续传
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...
- luogu 4366 [Code+#4]最短路 Dijkstra + 位运算 + 思维
这个题思路十分巧妙,感觉很多题都有类似的套路. 我们发现异或操作其实就是将一个数的二进制的若干个 $0$ 变成 $1$,或者一些 $1$ 变成 $0$. 而每次按照某种顺序一位一位地异或也可以起到同时 ...
- [LightOJ1008]Fibsieve`s Fantabulous Birthday 题解
前言 扫了一眼网上的题解,都是找规律. 估计就我一个蒟蒻在打二分. 题解 设一个" ┐"形为一层. 我们二分查找该数在那一层,然后就可以直接计算它的位置了. 代码 #include ...
- Codeforces Round #345 (Div 2)
最后两题是orzCJK学长帮忙代打的,不过总算是到蓝名了(上次睡迟了,只剩半个小时,结果作大死点开题目看,结果rating掉了100多),还有论代码风格的重要性!!!(没写空格被学长各种D) A题 题 ...
- 举例子说明ubuntu中remove,autoremove,purge区别
转自:慎用 apt-get autoremove ! apt-get 提供了一个用于下载和安装软件包的简易命令行界面.卸载软件包主要有这3个命令 remove – 卸载软件包autoremove ...
- 命令行创建 vue 项目(仅用于 Vue 2.x 版本)
1 .安装 Node.js 和 npm ( 验证安装成功输入下图 1 命令行可得 2:输入命令行 3 可得 4 即安装成功) 2.安装全局 webpack (安装依照下图输入命令行 1 耐心等待至到出 ...
- (66)Nginx+lua+Redis开发
一. 概述 Nginx是一个高性能,支持高并发的,轻量级的web服务器.目前,Apache依然web服务器中的老大,但是在全球前1000大的web服务器中,Nginx的份额为22.4%.Nginx采用 ...