[APIO2014]连珠线 题解
我们设初始的那个点为root。则所有的蓝色链都是形如father−now−sonfather-now-sonfather−now−son。
我们设计两个dp状态: dpi,0dp_{i,0}dpi,0表示i号点不作为蓝色链的中间点,dpi,1dp_{i,1}dpi,1表示作为中间点。则以下的转移就非常容易了。
dpi,0=∑max(dpu,1+w,dpu,0)dp_{i,0}=\sum \max(dp_{u,1}+w,dp_{u,0})dpi,0=∑max(dpu,1+w,dpu,0)
dpi,1=∑max(dpu,1+w,dpu,0)+max{dpu,0+w−max(dpu,1+w,dpu,0)}dp_{i,1}=\sum \max (dp_{u,1}+w,dp_{u,0}) + \max\{dp_{u,0}+w - \max (dp_{u,1}+w,dp_{u,0}) \}dpi,1=∑max(dpu,1+w,dpu,0)+max{dpu,0+w−max(dpu,1+w,dpu,0)}
换根dp就ok了。
#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define check_min(a,b) a=min(a,b)
#define check_max(a,b) a=max(a,b)
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
/*}
*/
const int MAXN=200000+20;
int n,rest=-2e9,dp[MAXN][2];
vector<mp> g[MAXN];
void prework(int now,int pre){int Max=-2e9;dp[now][0]=0;for(auto it:g[now]){int u,w; u=it.FIR,w=it.SEC; if(u==pre) continue;prework(u,now);dp[now][0]+=max(dp[u][1]+w,dp[u][0]);check_max(Max,dp[u][0]+w-max(dp[u][1]+w,dp[u][0]));}dp[now][1]=Max+dp[now][0];
}
void change_root(int now,int pre){vector<mp> V;V.PB({-2e9,-1});dp[now][0]=0;for(auto it:g[now]){int u,w; u=it.FIR,w=it.SEC;dp[now][0]+=max(dp[u][1]+w,dp[u][0]);V.PB({dp[u][0]+w-max(dp[u][1]+w,dp[u][0]),u});}check_max(rest,dp[now][0]);sort(ALL(V)),reverse(ALL(V));int old=dp[now][0];for(auto it:g[now]){int u=it.FIR,w=it.SEC;if(u!=pre){dp[now][0]=old-max(dp[u][1]+w,dp[u][0]);dp[now][1]=dp[now][0]+(V[0].SEC==u? V[1].FIR:V[0].FIR);change_root(u,now);}}
}
int main(){scanf("%d",&n);rb(i,2,n){int a,b,c;scanf("%d%d%d",&a,&b,&c);g[a].PB({b,c});g[b].PB({a,c});}prework(1,0);change_root(1,0);cout<<rest<<endl;return 0;
}
[APIO2014]连珠线 题解相关推荐
- 洛谷P3647 [APIO2014] 连珠线 题解
洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...
- 【BZOJ3677】[Apio2014]连珠线 换根DP
[BZOJ3677][Apio2014]连珠线 Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做"连珠线".不出所料,玩这个游戏只需要珠子和线,珠子从1 ...
- P3647 [APIO2014]连珠线
题意 传送门 题解 我们发现,如果一棵树的形态固定了,那么蓝线的方向一定是son[x]-x-fa[x],那么我们就可以先随便定一个根进行DP. 我们设f[i][0]f[i][0]f[i][0]表示以i ...
- [APIO2014]连珠线
题目链接 分析 首先考虑朴素算法. 可以枚举每个节点作为根,这样的话连接的树的形态就确定了. 应为我们可以知道每个点只可能是一个蓝边的中点,不难想到设一个DP状态表示节点是否为蓝边的中点,设 dp[i ...
- APIO2014 连珠线
题目链接:戳我 换根DP 由于蒟蒻不会做这个题,所以参考了大佬. 本来想的是有三种情况,一种是该节点不作为两个蓝线的中点(我们称这种不是关键节点),一种是该节点作为关键点.连两个子节点,一种是作为关键 ...
- BZOJ3677: [Apio2014]连珠线
这题刚了好久的treedp,一直WA比较大的点,不知道哪里错了以为我想法错了看题解结果都说换根好做些不换根很多特殊情况-. 咱觉得咱的想法没问题..,应该是一些细节没考虑好,又想了想一些反例就过去了 ...
- luogu P3647 [APIO2014] 连珠线
https://www.luogu.com.cn/problem/P3647 我写DP像cxk 发现只有两种连边的方式 假设最优的策略已经给了出来,那么一定存在选定某个点为根的时候,只存在第一种脸边的 ...
- [JZOJ]2109 清兵线 题解
[JZOJ]2109 清兵线 题解 FIRST 题目大意 给你一些正整数,这些正整数为数轴上若干个点代表的数.现求:假设从原点出发,走m以内(包括m)的距离最多能够访问多少个点,输出m-每个点到达时已 ...
- [BZOJ3677/UOJ#105][APIO2014]Beads and wires 连珠线(树形dp+换根)
Address https://www.lydsy.com/JudgeOnline/problem.php?id=3677 http://uoj.ac/problem/105 Solution 考虑一 ...
最新文章
- 楚天高速拟12.6亿并购三木智能 涉足物联网领域
- iOS安全之二次封装AFN并设置请求头/执行HTTPS加强安全
- 易捷win10系统电脑卡在“正在关机”界面怎么处理?
- linux选择最短路径sdn,基于网络流量的SDN最短路径转发应用
- 交换两个变量ab的值PHP,由[交换两个变量的值问题]理解程序的时空复杂度
- 2021HDU多校8 - 7057 Buying Snacks(矩阵快速幂套NTT优化dp)
- 安装MAMP后的控制台访问mysql问题
- PDH-SDH光端机指示灯具体含义介绍
- Linux平台上搭建apache+tomcat负载均衡集群
- java 同步锁_死磕 java同步系列之自己动手写一个锁Lock
- QQ红包源码 大转盘抽奖源码下载 微信红包源码
- python runner功能_Python 如何使用 HttpRunner 做接口自动化测试
- Virtual关键字的说明
- 西电计算机网络ppt,《西安电子科技大学》PPT课件
- Visio2013安装教程
- ps把一张图里面的文字去掉而不改变字后面的背景;把同一个颜色的改为别的颜色
- 计算机桌面死机的原因是,假死机(电脑桌面假死或卡死)
- super()的两个参数
- 手把手Neo4j教程,超全!!!
- UNCTF2022-公开赛|Crypto