[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 ...
随机推荐
- ios获取系统当前日期并以一定格式显示
NSDate *date=[NSDate date]; NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init]; [dateform ...
- 【NOIP2016提高A组五校联考4】ksum
题目 分析 发现,当子段[l,r]被取了出来,那么[l-1,r].[l,r+1]一定也被取了出来. 那么,首先将[1,n]放入大顶堆,每次将堆顶的子段[l,r]取出来,因为它是堆顶,所以一定是最大的子 ...
- kong CentOS7网关安装
1.先安装postgres数据库,yum安装.yum install postgresql96yum install postgresql96-server配置环境变量export PGDATA=/v ...
- mysql MAX()函数 语法
mysql MAX()函数 语法 作用:返回一列中的最大值.NULL 值不包括在计算中.直线电机模组--BZD80N 语法:SELECT MAX(column_name) FROM table_nam ...
- sh_04_累加求和
sh_04_累加求和 # 计算 0 ~ 100 之间所有数字的累计求和结果 # 0. 定义最终结果的变量 result = 0 # 1. 定义一个整数的变量记录循环的次数 i = 0 # 2. 开始循 ...
- Bootstap
Bootstrap框架 Bootstrap框架 Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序 ...
- C# walls
在学习C#的阶段中,我们一点一点的往前爬, 此代码需要添加selenium ,和 获取 引用. using Ivony.Html.Parser; using Ivony.Html; using Ope ...
- centos网卡配置NM_CONTROLLED=”yes” 慎用
今天有1台服务器修改了 /etc/sysconfig/network-scripts/ifcfg-eth0 配置文件中的一个参数: NM_CONTROLLED=“yes” 修改成 NM_CONTROL ...
- java 用redisTemplate 的 Operations存取list集合
一 .存取为list类型 @RestController @RequestMapping("/test") @Slf4j public class TestController { ...
- [LeetCode]-DataBase-Nth Highest Salary
Write a SQL query to get the nth highest salary from the Employee table. +----+--------+ | Id | Sala ...