【BZOJ4297】[PA2015]Rozstaw szyn

Description

给定一棵有n个点,m个叶子节点的树,其中m个叶子节点分别为1到m号点,每个叶子节点有一个权值r[i]。你需要给剩下n-m个点各指定一个权值,使得树上相邻两个点的权值差的绝对值之和最小。

Input

第一行包含两个正整数n,m(2<=n<=500000,1<=m<=n),分别表示点数和叶子数。
接下来n-1行,每行两个正整数u,v(1<=u,v<=n),表示u与v之间有一条边。
接下来m行,每行一个正整数,依次为r[1],r[2],...,r[m](1<=r[i]<=500000),表示每个叶子的权值。

Output

输出一个整数,即树上相邻两个点的权值差的绝对值之和的最小值。

Sample Input

6 4
1 5
2 5
3 6
4 6
5 6
5
10
20
40

Sample Output

35

题解:思路同BZOJ1304,咱们先来证几个结论:

1.我们从下往上逐层贪心,每次选择一个点的取值范围时,只保证它与它的儿子之间差的绝对值之和最小,而不考虑它的父亲。这样为什么是对的呢?假如x的最优值为v,我们为了使它的父亲更优,将x的取值改为v+d,那么x与x父亲之间的差会减小d,但 x的所有值<=v的儿子 与x之间的差都增加了d。具体地,如果x有a个儿子,那么增加量至少是d。显然是没有一开始优的。

2.以哪个非叶子节点为根进行DP,最后得到的答案都是一样的。假如当前根为x,x的儿子是y。那么如果x的最优取值区间被y包含,相当于x和y之间的差可以为0,那么如果把y当成根,则y的取值区间显然也会被x包含(不要问为什么显然~)。否则我们不考虑x-y这条边,x的取值范围是[l,r],那么在考虑y的贡献后x的取值范围只可能是[...,l]或[r,...],即其他点对x的影响可视为不变,那么只需要最后加上x-y的贡献即可。把y当根也是同理,所以将那个点当成根答案都是一样的。

所以具体做法:随便找一个点当根进行DP,然后用每个点的儿子的最优取值区间来得到当前点的最优取值区间。具体地,我们将x的所有儿子的最优取值区间的左右端点放到一起排序,然后取中间的那段即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=500010;
typedef long long ll;
int n,m,cnt;
ll ans;
int to[maxn<<1],next[maxn<<1],head[maxn],l[maxn],r[maxn],p[maxn<<1];
inline void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x,int fa)
{
if(x<=m) return ;
int i,tot=0;
for(i=head[x];i!=-1;i=next[i]) if(to[i]!=fa) dfs(to[i],x);
for(i=head[x];i!=-1;i=next[i]) if(to[i]!=fa) p[++tot]=l[to[i]],p[++tot]=r[to[i]];
sort(p+1,p+tot+1);
l[x]=p[tot>>1],r[x]=p[(tot>>1)+1];
for(i=head[x];i!=-1;i=next[i]) if(to[i]!=fa&&(r[to[i]]<l[x]||l[to[i]]>l[x]))
ans+=min(abs(l[to[i]]-l[x]),abs(r[to[i]]-l[x]));
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
//freopen("bz4297.in","r",stdin);
n=rd(),m=rd();
int i,j,a,b;
memset(head,-1,sizeof(head));
for(i=1;i<n;i++) a=rd(),b=rd(),add(a,b),add(b,a);
for(i=1;i<=m;i++) l[i]=r[i]=rd();
if(n==m)
{
for(i=1;i<=n;i++) for(j=head[i];j!=-1;j=next[j]) ans+=abs(l[to[j]]-l[i]);
printf("%lld",ans>>1);
return 0;
}
dfs(n,0);
printf("%lld",ans);
return 0;
}

【BZOJ4297】[PA2015]Rozstaw szyn 树形DP的更多相关文章

  1. BZOJ4297 : [PA2015]Rozstaw szyn

    每个点的最优取值范围是一个区间,将叶子一层层剥去,得到一棵有根树,父亲的取值范围由儿子推得,时间复杂度$O(n\log n)$. #include<cstdio> #include< ...

  2. [PA2015]Rozstaw szyn

    [PA2015]Rozstaw szyn 题目大意: 一棵\(n(n\le5\times10^5)\)个点的树,其中有\(m\)个结点是叶子结点.叶子结点权值已知,你可以自己决定其余结点的权值,定义整 ...

  3. bzoj 4297: [PA2015]Rozstaw szyn【瞎搞】

    从叶子往上先拓扑一下,建立虚拟root,从root开始dfs.注意到每个点的最优取值一定是一个区间(中位数区间),从儿子区间推出父亲区间即可 #include<iostream> #inc ...

  4. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  5. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  6. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  7. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  8. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  9. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

随机推荐

  1. python 多线程爬虫 实例

    多进程 Multiprocessing 模块 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建. star() 方法启动 ...

  2. 数据库入门级面试题(带答案) 数据库简单面试题(带答案) MySQL面试题带答案

    数据库入门[mysql]   1.假设要按照分页(每页显示10条)的形式获取test表中的数据,在MySql数据库中,以下哪条语句是取第2页中的数据?(单选)   (难度A) A.select * f ...

  3. HTTP 403详解

    1.什么是Http 403错误Http协议中对403错误定义如下The server understood the request, but is refusing to fulfill it. Au ...

  4. 使用Cookie报错Control character in cookie value, consider BASE64 encoding your value

    参考资料: http://www.blogjava.net/persister/archive/2009/10/02/297103.html http://blog.csdn.net/xiaozhen ...

  5. 一款基于jQuery和HTML5全屏焦点图

    今天爱编程小编给大家分享一款非常绚丽的jQuery焦点图插件,同时这款焦点图也利用了HTML5和CSS3的相关特性,使图片切换效果更加丰富多彩.另外,这款jQuery焦点图插件的特点是全屏的效果,因此 ...

  6. php服务器环境变量

    可以把一些配置写到apache或nginx的配置里,然后在代码里判断环境变量来实现开发环境和线上环境的切换. 比如在本地可以 SetEnv APP_ENV local线上则 SetEnv APP_EN ...

  7. 个别图片IE中无法显示问题

    今天有人保障,某些图片在IE下无法打开,但是其他浏览器均没有问题.以前还真没遇到过这类问题,从上至下查看了一遍,能排除的因素基本都排除了,还是不知道为什么不能显示,真是奇怪了.最后注意到无法显示的图片 ...

  8. jQuery替换内容

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  9. 【BZOJ】2005: [Noi2010]能量采集(欧拉函数+分块)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2005 首先和某题一样应该一样可以看出每个点所在的线上有gcd(x,y)-1个点挡着了自己... 那么 ...

  10. java基础知识总结8(数据库篇1)

    一. Oracle的安装(windowXP.win7.Linux)和卸载 1.1 Oracle的安装 1.1.1 在WindowsXP.Win7下安装 第一:解压win32_11gR2_databas ...