【UOJ #105】【APIO2014】Beads and wires
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;
}
【UOJ #105】【APIO2014】Beads and wires的更多相关文章
- 【UOJ#32】【UR #2】跳蚤公路(最短路)
[UOJ#32][UR #2]跳蚤公路(最短路) 题面 UOJ 题解 不难发现要求的就是是否存在负环.也就是我们只需要找到所有的负的简单环,很容易就可以想到维护路径上和\(x\)相关的内容,即维护一下 ...
- 【UOJ】67 新年的毒瘤 &【BZOJ】1123 BLO
[UOJ 67] 题目链接: 传送门 题解: 第一眼很懵逼……这什么鬼. 思考什么点复合条件……(o(>﹏<)o 1.树,也就是说还剩n-2条边,等价于要删去一个度数为m-n+2的点. 2 ...
- 【UOJ#236】[IOI2016]railroad(欧拉回路,最小生成树)
[UOJ#236][IOI2016]railroad(欧拉回路,最小生成树) 题面 UOJ 题解 把速度看成点,给定的路段看成边,那么现在就有了若干边,然后现在要补上若干边,以及一条\([inf,\) ...
- 【UOJ#177】欧拉回路
[UOJ#177]欧拉回路 题面 UOJ 题解 首先图不连通就没啥好搞的了. 对于无向图而言,每个点度数为偶数. 对于有向图而言,每个点入度等于出度. 然后就是一本通上有的做法,直接\(dfs\)一遍 ...
- 【UOJ#311】【UNR #2】积劳成疾(动态规划)
[UOJ#311][UNR #2]积劳成疾(动态规划) UOJ Solution 考虑最大值分治解决问题.每次枚举最大值所在的位置,强制不能跨过最大值,左右此时不会影响,可以分开考虑. 那么设\(f[ ...
- 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)
[UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...
- 【UOJ#246】套路(动态规划)
[UOJ#246]套路(动态规划) 题面 UOJ 题解 假如答案的选择的区间长度很小,我们可以做一个暴力\(dp\)计算\(s(l,r)\),即\(s(l,r)=min(s(l+1,r),s(l,r- ...
- 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)
[UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
随机推荐
- 【BZOJ】1355 [Baltic2009]Radio Transmission
[算法]KMP [题解]KMP中n-next[n]得到最小循环节的性质. 考虑一个循环串(最后一个循环节可能残缺),它最长的[后缀=前缀]一定是以第二个循环节为起始位置的后缀. 正着考虑的话假设后缀T ...
- idea中tomcat乱码问题解决
在idea中经常遇到jsp的乱码问题,原因是编码不是UTF-8的问题,这次来彻底解决idea的编码问题 首先设置idea编辑器的编码: File-Setting设置如下 然后配置tomcat的编码问题 ...
- 解决Chrome下表单自动填充后背景色为黄色
Chrome浏览器在表单自动填充后会显示黄色背景,这是Chrome的私有属性导致,对于有洁癖的人来讲,是不喜欢的,我们可以手动去掉. 代码如下: input:-webkit-autofill { -w ...
- htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容
Htmlunit是一款模拟浏览抓取页面内容的java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取. 下载地址: https:// ...
- 南邮综合题writeup
http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/index.php fuckjs直接console得到地址 http: ...
- mysql安装后开启远程
操作系统为centos7 64 1.修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2. ...
- Java杂知识汇总(自己积累的)
[前提] 接下来,可能需要开始学习Java了,所以现在将前辈们传递给我的经验都记录下来,免得再次问他们. [积累] 1. 关于重启Tomcat服务器: 当在开发过程中, | 修改Java代码 -- 需 ...
- 部署weblogic 12c的几点收获
最近刚编写完weblogic12c的部署脚本,这里将过程中的几点收获进行记录: 1.windows下编写的脚本在linux环境下运行需要dos2unix进行格式转换 2.weblogic安装环境检测需 ...
- solr应用
Solr是apache的顶级开源项目,它是使用java开发 ,基于lucene的全文检索服务器.Solr比lucene提供了更多的查询语句,而且它可扩展.可配置,同时它对lucene的性能进行了优化. ...
- 20180830 安装git时报错,
安装:https://blog.csdn.net/u013256816/article/details/54743470 解决问题:https://blog.csdn.net/daojibruce/a ...