博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jzoj 3519. 灵能矩阵
阅读量:6354 次
发布时间:2019-06-22

本文共 2303 字,大约阅读时间需要 7 分钟。

题目大意:

有一颗N个节点的树,每个叶子节点有一个权值,非叶子节点的权值为该节点的子节点的权值和。

我们可以使得叶子节点的权值减少一些(不定),但是不能增加。现在有一个定义——平衡:当一个节点的所有子节点的权值相同时这个节点是平衡的,求使这棵树的所有节点平衡最少要减去的权值和

解题思路:

一开始我想的是由深度最大的节点开始,将同一深度的节点减权值到这一深度节点的最小权值

我发现这是错了,比如有一组数据:
6
0 0 1 1 9 9
1 2
1 3
1 4
2 5
2 6
我的代码输出17
正确答案应该为20
为什么是二十呢:
首先,深度为3的有5 6,5 6 的父亲是2,5 6权值相同,然后2就是平衡的
然后深度为2的有2, 3, 4,权值分别为:18 1 1
我的程序将2的权值减去17,然后这一层就相同了
但是我们发现,当2的权值减去17,剩下1时,5 6的权值就不相同(2的权值 = 5的权值 + 6的权值 = 1)
所以就是错的

于是我们就要维护一个g[x]表示假如把x这个点改成m,那m应该是g[x]的倍数。

那么这个g[x]应该怎么求呢,应该是(所有g[son]的lcm)*(son的个数),想想为什么,因为我们要是我们这个被分下去的数要满足是自己son数的个数,还要满足是自己son的son的个数……这样下去,就是lcm咯~
于是我们就可以做了,每次我们设把这一排子节点改成m,然后m就应该是=min(son中最小的一个)-min mod (g[x]son的个数g[x]son的个数),为什么呢,因为我们要满足它只能减,不能加,所以要取最小的,然后又要是g[x]的倍数,所以就要减去它们的余数,就可以整除了,最优一次次累加,就得到了ans~~
——引自

Accepted code:

#include
#include
#include
#include
#define maxn 200005#define ll long longstruct edge {
; ll to, next;}e[maxn];ll ls[maxn], n, a[maxn], son[maxn];ll ans = 0;bool v[maxn];inline ll read() {
ll x = 0; char c = getchar(); while (!isdigit(c)) c = getchar(); while (isdigit(c)) x = (x<<1) + (x<<3) + c -'0', c = getchar(); return x;}ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a%b);}ll lcm(ll a, ll b) {
return a / gcd(a, b) * b;}void wodefuck(ll now) {
v[now] = 1; if (a[now] != 0) {
son[now] = 1; return; } ll tot = 0, minn = 9e18, sum = 0; son[now] = 1; for (ll i = ls[now]; i; i = e[i].next) if (!v[e[i].to]) {
wodefuck(e[i].to); sum += a[e[i].to]; tot++; minn = std::min(minn, a[e[i].to]); son[now] = lcm(son[e[i].to], son[now]); } son[now] *= tot; ll m = minn - (minn % (son[now] / tot)); ans += sum - m * tot; a[now] = m * tot; return;}signed main() {
/*freopen("pylon.in", "r" ,stdin); freopen("pylon.out", "w", stdout);*/ n = read(); for (ll i = 1; i <= n; i++) a[i] = read(); ll l = 0; for (ll i = 1; i < n; i++) {
ll x = read(), y = read(); e[++l] = (edge){
y, ls[x]}; ls[x] = l; e[++l] = (edge){
x, ls[y]}; ls[y] = l; } wodefuck(1); printf("%lld\n", ans);}

转载于:https://www.cnblogs.com/Juruo-HJQ/p/10285791.html

你可能感兴趣的文章
秋名山老司机(详解)——bugku
查看>>
RED | Robot Framework集成开发环境
查看>>
育碧同 Mozilla 联手开发 AI 代码助手
查看>>
【实用】面对枯燥的源码,如何才能看得下去?
查看>>
智库说 | 徐远:数字时代的城市潜力
查看>>
《JSP极简教程》jsp c:forEach用法
查看>>
WebSocket详解(六):刨根问底WebSocket与Socket的关系
查看>>
用 Go 写一个轻量级的 ssh 批量操作工具
查看>>
网站设计之合理架构CSS 架构CSS
查看>>
OTP 22.0 RC3 发布,Erlang 编写的应用服务器
查看>>
D语言/DLang 2.085.1 发布,修复性迭代
查看>>
感觉JVM的默认异常处理不够好,既然不好那我们就自己来处理异常呗!那么如何自己处理异常呢?...
查看>>
Java 基础 之 算数运算符
查看>>
Windows下配置安装Git(二)
查看>>
一个最简单的基于Android SearchView的搜索框
查看>>
铁路开通WiFi“钱景”不明
查看>>
Facebook申请专利 或让好友及陌生人相互拼车
查看>>
电力“十三五”规划:地面光伏与分布式的分水岭
查看>>
美联社再告FBI:要求公开请黑客解锁iPhone花费
查看>>
三星电子出售希捷和夏普等四家公司股份
查看>>