[PA2015]Rozstaw szyn
[PA2015]Rozstaw szyn
题目大意:
一棵\(n(n\le5\times10^5)\)个点的树,其中有\(m\)个结点是叶子结点。叶子结点权值已知,你可以自己决定其余结点的权值,定义整棵树的代价为相邻结点权值差之和,求最小总代价。
思路:
贪心,对于每个结点可以维护其取值范围的上界和下界。将子结点的上界下界一并排序,取其中间两个数,即为父结点上界和下界。计算总代价时,令结点权值为其权值下界,可以证明不会影响答案。
时间复杂度\(\mathcal O(n\log n)\)。
源代码:
#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
inline int getint() {
	register char ch;
	while(!isdigit(ch=getchar()));
	register int x=ch^'0';
	while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
	return x;
}
typedef long long int64;
const int N=5e5+1;
int n,m,l[N],r[N];
int64 ans;
std::vector<int> e[N];
inline void add_edge(const int &u,const int &v) {
	e[u].push_back(v);
	e[v].push_back(u);
}
void dfs(const int &x,const int &par) {
	if(x<=m) return;
	std::vector<int> v;
	for(unsigned i=0;i<e[x].size();i++) {
		const int &y=e[x][i];
		if(y==par) continue;
		dfs(y,x);
		v.push_back(l[y]);
		v.push_back(r[y]);
	}
	std::sort(v.begin(),v.end());
	l[x]=v[v.size()/2-1];
	r[x]=v[v.size()/2];
	for(register unsigned i=0;i<e[x].size();i++) {
		const int &y=e[x][i];
		if(y==par||(l[y]<=l[x]&&l[x]<=r[y])) continue;
		ans+=std::min(std::abs(l[x]-l[y]),std::abs(l[x]-r[y]));
	}
}
int main() {
	n=getint(),m=getint();
	for(register int i=1;i<n;i++) {
		add_edge(getint(),getint());
	}
	for(register int i=1;i<=m;i++) {
		l[i]=r[i]=getint();
	}
	if(n==2) {
		if((l[1]<=l[2]&&l[2]<=r[1])||(l[1]<=r[2]&&r[2]<=r[1])) {
			puts("0");
		} else {
			printf("%d\n",std::min(std::abs(l[1]-r[2]),std::abs(l[2]-r[1])));
		}
		return 0;
	}
	dfs(n,0);
	printf("%lld\n",ans);
	return 0;
}
												
											[PA2015]Rozstaw szyn的更多相关文章
- 【BZOJ4297】[PA2015]Rozstaw szyn 树形DP
		
[BZOJ4297][PA2015]Rozstaw szyn Description 给定一棵有n个点,m个叶子节点的树,其中m个叶子节点分别为1到m号点,每个叶子节点有一个权值r[i].你需要给剩下 ...
 - BZOJ4297 : [PA2015]Rozstaw szyn
		
每个点的最优取值范围是一个区间,将叶子一层层剥去,得到一棵有根树,父亲的取值范围由儿子推得,时间复杂度$O(n\log n)$. #include<cstdio> #include< ...
 - bzoj 4297: [PA2015]Rozstaw szyn【瞎搞】
		
从叶子往上先拓扑一下,建立虚拟root,从root开始dfs.注意到每个点的最优取值一定是一个区间(中位数区间),从儿子区间推出父亲区间即可 #include<iostream> #inc ...
 - bzoj AC倒序
		
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
 - BZOJ 4291: [PA2015]Kieszonkowe  水题
		
4291: [PA2015]Kieszonkowe Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnli ...
 - 2018.07.23[PA2015]Siano(线段树)
		
[PA2015]Siano 描述 Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘 ...
 - 【BZOJ4295】[PA2015]Hazard 乱搞
		
[BZOJ4295][PA2015]Hazard Description 有n个人在轮流玩赌博机,一开始编号为i的人有a[i]元钱.赌博机可以抽象为一个长度为m的仅包含1和-1的序列,若抽到1,那么你 ...
 - BZOJ4292 PA2015 Równanie 【暴力水题】
		
BZOJ4292 PA2015 Równanie Description 对于一个正整数n,定义f(n)为它十进制下每一位数字的平方的和.现在给定三个正整数k,a,b,请求出满足a<=n< ...
 - bzoj 4295 [PA2015]Hazard 贪心,暴力
		
[PA2015]Hazard Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 69 Solved: 19[Submit][Status][Discus ...
 
随机推荐
- idea 设置选中代码得背景颜色
 - springboot配置Druid监控
			
整体步骤: (1) —— Druid简单介绍,具体看官网: (2) —— 在pom.xml配置druid依赖包: (3) —— 配置application.propertie ...
 - gitlab报错502及处理
			
报错截图: 解决: 1.端口问题 如上面写的815端口,那配置文件的8080端口都改成815端口 之后重新载入配置文件,并开启 gitlab-ctl reconfigure gitlab-ctl st ...
 - mysql集群7.4.1
			
一:mysql集群原理: 1 mysql集群分为三个节点: 1.1 控制节点:本身不提供服务只是控制整个集群的开启与关闭 1.2 数据节点:真正提供数据库的存储,并和其他数据节点关联用 1.3 sql ...
 - SQLServer索引及统计信息
			
索引除了提高性能,还能维护数据库. 索引是一种存储结构,主要以B-Tree形式存储信息. B-Tree的定义: 1.每个节点最多只有m个节点(m>=2) 2.除了根节点和叶子节点外的每个节点上最 ...
 - spring的4种事务特性,5种隔离级别,7种传播行为
			
spring事务: 事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性 (atomicity):强调事务的不可分割. 一致性 (con ...
 - sed 简单修改配置文件ip地址
			
sed -i 's/old ip/new ip/g' file.txt
 - activemq 控制面板里Number Of Pending Messages、 Messages Enqueued等含义解释
			
项目中在API登录接口采用了ActiveMQ消息队列中间件,采用三台MQ做集群
 - FATAL ERROR: please install the following Perl modules before executing ./mysql_install_db: Data::Dumper
			
今天安装本地数据库,所遇到的错误 FATAL ERROR: please install the following Perl modules before executing ./mysql_ins ...
 - 2018牛客网暑假ACM多校训练赛(第五场)H subseq 树状数组
			
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round5-H.html 题目传送门 - https://www.no ...