[ABC259F] Select Edges 题解
很容易想到树形 dp。
考虑在有根树内,每个点都有两种状态:
- 不选自己和父亲的边;
- 要选自己和父亲的边。
那么单独对于子树内部而言,就要分两种情况:
- 最多可以向 \(d_i\) 个孩子连边,对应上述第一种情况,我们称之为 \(f_i\);
- 最多可以向 \(d_i-1\) 个孩子连边,对应上述第二种情况,我们称之为 \(dp_i\)。
最基本的状态是不选自己和子树的连边,答案即为 \(\sum\limits_{j\in ison} f_j\)。
然后发现每次连 \((i,j)\) 这条边,答案会加上 \(mx_j=dp_j+w_{(i,j)}-f_j\)。
那么对于 \(f_i\),就可以挑选前 \(d_i\) 大的 \(mx_j\),答案加上所有 \(>0\) 的 \(mx\) 值。\(dp_i\) 同理。
时间复杂度 \(O(n\log n)\)。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3e5+5;
int n,k,u[N],v[N],d[N],r[N];
int m,h[N],to[N*2],nxt[N*2];
ll w[N*2],mx[N],f[N],dp[N];
int cmp(ll x,ll y){return x>y;}
void add(int x,int y,ll z){
to[++m]=y;
w[m]=z;
nxt[m]=h[x];
h[x]=m;
}void dfs(int x,int fa){
for(int i=h[x];i;i=nxt[i]){
int y=to[i];
if(y==fa) continue;
dfs(y,x);
dp[x]+=f[y];
}int k=0;
for(int i=h[x];i;i=nxt[i])
if(to[i]!=fa)
mx[++k]=dp[to[i]]+w[i]-f[to[i]];
sort(mx+1,mx+k+1,cmp);
for(int i=1;i<d[x];i++){
if(mx[i]<=0) break;
dp[x]+=mx[i];
}f[x]=dp[x];
if(mx[d[x]]>0) f[x]+=mx[d[x]];
if(!d[x]) dp[x]=-1e9;
for(int i=1;i<=k;i++) mx[i]=0;
}int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>d[i];
for(int i=1;i<n;i++){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}dfs(1,0);
cout<<f[1];
return 0;
}
[ABC259F] Select Edges 题解的更多相关文章
- LeetCode Number of Connected Components in an Undirected Graph
原题链接在这里:https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/ 题目: Giv ...
- R画网络图
R 画网络图 目的:用R做生信分析,画基因样本的网络图,从中观察样本的致病性情况. 一.所用到的包 library(tidyr) library(ggplot2) library(reshape2) ...
- LeetCode 323. Number of Connected Components in an Undirected Graph
原题链接在这里:https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/ 题目: Giv ...
- POJ 3241 曼哈顿距离最小生成树 Object Clustering
先上几个资料: 百度文库有详细的分析和证明 cxlove的博客 TopCoder Algorithm Tutorials #include <cstdio> #include <cs ...
- ArcMap所有Command GUID
The information in this topic is useful if you're trying to programmatically find a built-in command ...
- Open Cascade:如何从AIS_Shape导出TopoDS_Shape?
Open Cascade:如何从AIS_Shape导出TopoDS_Shape? 实现代码如下: if( !myAISContext->HasOpenedContext()) { wxMessa ...
- AGC033 D~F——[ 值放到角标的DP ][ 思路+DP ][ 思路 ]
地址:https://atcoder.jp/contests/agc033/ D Complexity dp[ i ][ j ][ k ][ l ] 表示左上角是 ( i , j ) .右下角是 ( ...
- 最全的ORACLE-SQL笔记
-- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unloc ...
- Matplotlib数据可视化(6):饼图与箱线图
In [1]: from matplotlib import pyplot as plt import numpy as np import matplotlib as mpl mpl.rcParam ...
- 2021.07.17 题解 CF1385E Directing Edges(拓扑排序)
2021.07.17 题解 CF1385E Directing Edges(拓扑排序) CF1385E Directing Edges - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) ...
随机推荐
- 开源 - Ideal库 - Excel帮助类,ExcelHelper实现(四)
书接上回,前面章节已经实现Excel帮助类的第一步TableHeper的对象集合与DataTable相互转换功能,今天实现进入其第二步的核心功能ExcelHelper实现. 01.接口设计 下面我们根 ...
- canvas(三)绘制矩形
1.绘制矩形轨迹 相关语法:ctx.rect(x,y,width,height),根据传入的参数(起始坐标和宽高)用来绘制一个矩形轨迹 注意:ctx.rect()和ctx.lineTo()绘制的都是轨 ...
- uniapp安卓在线更新版本
实现逻辑 通过获取线上的版本号和app的版本号进行对比 查看是不是最新版 - app版本号小于线上版本号则不是最新版 提示更新 模拟检测更新请求 起一个服务,也就是检测更新的接口 返回值为最新版本号和 ...
- 实用干货分享 - Oracle数据库RPM部署指南
下载依赖和Oracle19c版本的RPM包 http://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-dat ...
- git恢复到之前提交的记录
项目搞崩了,还提交上去了怎么办? 那当然是恢复到之前的提交记录了,那怎么操作呢? 首先,到代码托管平台找到你想恢复的提交记录(在此以github为例) 获取 commit id 首先,通过如下图操作获 ...
- Qt编写安防视频监控系统37-onvif预置位
一.前言 预置位在视频监控系统中是不可或缺的存在,响应预置位功能的前提是要带预置位的云台球机,有些普通的云台球机其实不带预置位的,这个要检查清楚,硬件上不支持该功能的,你再怎么点也没反应.在这个视频监 ...
- 由于OpenCV的#include <opencv2/opencv.hpp>文件没有放在所有的头文件之前所引起的编译时提示很多错误,如:filesystem.hpp(11,12): error C2144: 语法错误:“bool”的前面应有“;”error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int等
现象描述: 由于OpenCV的#include <opencv2/opencv.hpp>文件没有放在所有的其他OpenCV头文件之前所引起的编译时提示很多错误,如:filesystem.h ...
- Python 项目组织最佳实践:从脚本到大型项目的进化之路
在 Python 开发生涯中,相信很多人都是从写简单脚本开始的.随着项目规模扩大,我们会遇到各种项目组织的问题.今天,让我们从一个实际场景出发,看看如何一步步优化 Python 项目结构,实现从简单脚 ...
- Solution Set -「NOIP Simu.」20221024
\(\mathscr{A}\sim\) 断 给定一棵含有 \(n\) 个点的树, 所有点初始时为白色. 再给出 \(m\) 个形如 \((u,v)\) 的点对, 要求 \(u\) 到 \(v\) ...
- 彻底讲透Spring AOP动态代理,原理源码深度剖析!
1.AOP:[动态代理]定义 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式: 2.基于注解aop的开发流程 1.导入aop模块:Spring AOP:(spring-asp ...