http://uoj.ac/problem/105
好神的dp啊。
确定一个点为根之后,蓝线只能是竖着的,不能横跨兄弟。
枚举每个点为根进行树形dp是\(O(n^2)\)的,\(f(x,0/1)\)表示以\(x\)为根的子树中\(x\)是否作为蓝线终点的最大值。
更科学的做法:\(O(1)\)把根从一个father转移到它的son。
需要维护\(f(father,1)\)的最大和次大(防止son作为最大转移到father),利用father的信息更新\(f(son,0)\)和\(f(son,1)\)的最大和次大(这里的换根不是真正把根换到son,只是说换根后son作为根的信息是正确的,不需要修改father的信息)。
时间复杂度\(O(n)\)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int N = 200003;struct node {int nxt, to, w;} E[N << 1];
int cnt = 0, point[N], f[N][2], fs[N][2];void ins(int u, int v, int w) {E[++cnt] = (node) {point[u], v, w}; point[u] = cnt;}int n, son[N], tot, fadis[N];void dfs(int x, int fa) {for (int i = point[x]; i; i = E[i].nxt)if (E[i].to != fa) fadis[E[i].to] = E[i].w, dfs(E[i].to, x);tot = 0;for (int i = point[x]; i; i = E[i].nxt)if (E[i].to != fa) son[++tot] = E[i].to;for (int i = 1; i <= tot; ++i)f[x][0] += max(f[son[i]][0], f[son[i]][1]);int mx = -0x7fffffff, mxs = -0x7fffffff, num;for (int i = 1; i <= tot; ++i) {num = f[son[i]][0] + fadis[son[i]] - max(f[son[i]][0], f[son[i]][1]);if (num >= mx) mxs = mx, mx = num;else if (num > mxs) mxs = num;}f[x][1] = mx + fadis[x] + f[x][0];fs[x][1] = mxs + fadis[x] + f[x][0];
}void move(int x, int y, int d) {int t, fx0 = f[x][0], fx1 = f[x][1], fxs1 = fs[x][1];if (fx1 == fx0 - max(f[y][1], f[y][0]) + f[y][0] + fadis[y]) fx1 = fxs1;fx0 -= max(f[y][1], f[y][0]);fx1 -= max(f[y][1], f[y][0]);fx1 += d;f[y][0] += max(fx0, fx1);f[y][1] += max(fx0, fx1);fs[y][1] += max(fx0, fx1);f[y][1] -= d; fs[y][1] -= d;if ((t = f[y][0] - max(fx0, fx1) + fx0 + d) >= f[y][1])fs[y][1] = f[y][1], f[y][1] = t;else if (t > fs[y][1]) fs[y][1] = t;
}int ans = 0;void dfsmove(int x, int fa) {ans = max(ans, f[x][0]);for (int i = point[x]; i; i = E[i].nxt) {int v = E[i].to;if (v == fa) continue;move(x, v, E[i].w);dfsmove(v, x);}
}int main() {scanf("%d", &n);int u, v, e;for (int i = 1; i < n; ++i) {scanf("%d%d%d", &u, &v, &e);ins(u, v, e);ins(v, u, e);}dfs(1, 0);dfsmove(1, 0);printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/abclzr/p/6728152.html

【UOJ #105】【APIO2014】Beads and wires相关推荐

  1. 【APIO2014】Palindromes

    #103. [APIO2014]Palindromes 统计 描述 提交 自定义测试 给你一个由小写拉丁字母组成的字符串 ss.我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这 ...

  2. 【UOJ#388】【UNR#3】配对树(线段树,dsu on tree)

    [UOJ#388][UNR#3]配对树(线段树,dsu on tree) 题面 UOJ 题解 考虑一个固定区间怎么计算答案,把这些点搞下来建树,然后\(dp\),不难发现一个点如果子树内能够匹配的话就 ...

  3. 【UOJ】67 新年的毒瘤 【BZOJ】1123 BLO

    [UOJ 67] 题目链接: 传送门 题解: 第一眼很懵逼--这什么鬼. 思考什么点复合条件--(o(>﹏<)o 1.树,也就是说还剩n-2条边,等价于要删去一个度数为m-n+2的点. 2 ...

  4. 【UOJ#188】Sanrd(min_25筛)

    [UOJ#188]Sanrd(min_25筛) 题面 UOJ 题解 今天菊开讲的题目.(千古神犇陈菊开,扑通扑通跪下来) 题目要求的就是所有数的次大质因子的和. 这个部分和\(min\_25\)筛中枚 ...

  5. 【UOJ#246】套路(动态规划)

    [UOJ#246]套路(动态规划) 题面 UOJ 题解 假如答案的选择的区间长度很小,我们可以做一个暴力\(dp\)计算\(s(l,r)\),即\(s(l,r)=min(s(l+1,r),s(l,r- ...

  6. 【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)

    [UOJ#33][UR #2]树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演,那么利用倍数形式,我们只需要求解是i的倍数的对数. 考虑枚举lca,这个 ...

  7. 【LeetCode】【HOT】105. 从前序与中序遍历序列构造二叉树(哈希表+递归)

    [LeetCode][HOT]105. 从前序与中序遍历序列构造二叉树 文章目录 [LeetCode][HOT]105. 从前序与中序遍历序列构造二叉树 package hot;import java ...

  8. 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)

    [UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...

  9. CSDN:2019年度CSDN博客之星评选竞赛——105号【一个处女座的程序猿】,感谢您,投上的宝贵一票,感谢!感恩!

    CSDN:2019年度CSDN博客之星评选竞赛--105号[一个处女座的程序猿],感谢您,投上的宝贵一票,感谢!感恩! 导读:新的一年,改革春风吹满地,新的一年要争气!  博主在此,祝所有朋友们,20 ...

最新文章

  1. WebPart(SharePoint)中如何使用自定义的Javascript和css样式
  2. 待飞日记(第四天和第五天)
  3. 看看 Grunt 的源码(一):grunt-cli 源码解析
  4. python中的format什么意思中文-python的format什么意思
  5. Android编译系统分析二:mm编译单个模块
  6. 提高博客访问量14种方法
  7. 设置QtreeWidget水平滚动条
  8. JDK源码(19)-Package
  9. python查询数据库后更新_python 实现数据库中数据添加、查询与更新的示例代码...
  10. Understanding .NET Code Access Security
  11. 加速失败远程计算机不能反应,2008 R2 SP1远程桌面如何开启GPU加速?不讨论虚拟机...
  12. java用户邮件激活
  13. findwindow\sendmessage向第三方软件发送消息演示
  14. Java的环境变量配置
  15. win2003 R2 SP2 x64 可用密钥
  16. Springcloud笔记超级详细
  17. matlab中二维散点图,MATLAB实例:二维散点图
  18. Revit中添加水平仰视平面图及水平剖面
  19. 转载:开源飞控的前世今生
  20. HP打印机驱动程序下载

热门文章

  1. EF实现——后台登陆,记住密码+主页面欢迎+管理员增删改查
  2. RC and RTM
  3. 拼图游戏c语言简单,(C语言拼图游戏.doc
  4. TP 5.0.24反序列化漏洞分析
  5. emcc 捕获到的一个 plsql 匿名块
  6. 【物联网】17位业内专家解析2018年物联网重要趋势
  7. DevOps:从「蒸汽时代」到「高铁时代」,SUNMI DevOps转型之路
  8. 什么商业模式是适合你,元宇宙电商NFG了解一下
  9. Linux服务器硬件与RAID配置
  10. SQL SERVER 数据库储存的值里面前后有空格,有可能是全角或者半角空格,如何在查询中处理