• [PA2015]Rozstaw szyn


    [PA2015]Rozstaw szyn

    题目大意:

    一棵(n(nle5 imes10^5))个点的树,其中有(m)个结点是叶子结点。叶子结点权值已知,你可以自己决定其余结点的权值,定义整棵树的代价为相邻结点权值差之和,求最小总代价。

    思路:

    贪心,对于每个结点可以维护其取值范围的上界和下界。将子结点的上界下界一并排序,取其中间两个数,即为父结点上界和下界。计算总代价时,令结点权值为其权值下界,可以证明不会影响答案。

    时间复杂度(mathcal O(nlog 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
    ",std::min(std::abs(l[1]-r[2]),std::abs(l[2]-r[1])));
    		}
    		return 0;
    	}
    	dfs(n,0);
    	printf("%lld
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    关于架构,关于系统,关于合作,我也得问问我们自己
    vs2013 无法打开 源 文件 "SDKDDKVer.h"
    视频基础知识汇总
    python gRPC接口调用
    python多线程同时执行2个函数任务之threading
    git基本操作_快速查询
    pycharm激活码 我是搬运工
    CodeReview的一些原则
    python多线程执行同一个函数任务之threading、ThreadPoolExecutor.map
    python程序超时处理 timeout_decorator
  • 原文地址:https://www.cnblogs.com/skylee03/p/10156791.html
Copyright © 2020-2023  润新知