博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ZJOI2007] 时态同步
阅读量:4310 次
发布时间:2019-06-06

本文共 936 字,大约阅读时间需要 3 分钟。

 

 

    显然的一个建模是,每个叶子对应一个权值,代表比最晚的叶子早了多久,然后我们要做的就是给每条边赋上值,使得每个叶子到根的路径上的所有边权值和等于叶子的权值。

    我们贪心的想一想,必然是离根越近的边赋值多的情况比较优(在保证同步的情况下),因为离根越近的边影响的叶子会更多。

    而对于两个节点 u,v,我们必须要在lca(u,v)以下的边中赋值使得 u和v同步,因为再往上的边对u和v的影响就相同了。

    于是根据以上两点,可以得到一个比较简单的dp。

     f[x]表示以x为根的子树所有叶子同步的最小代价,转移很简单,留给大家想了w

 

#include
#define ll long longusing namespace std;const int N=500005;int hd[N],ne[N*2],to[N*2],val[N*2],num,n,S,mx[N];ll f[N];inline void add(int x,int y,int z){ to[++num]=y,ne[num]=hd[x],hd[x]=num,val[num]=z;} inline int read(){ int x=0; char ch=getchar(); for(;!isdigit(ch);ch=getchar()); for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x;}void dfs(int x,int fa){ for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa) dfs(to[i],x),mx[x]=max(mx[x],mx[to[i]]+val[i]); for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa) f[x]+=f[to[i]]+mx[x]-mx[to[i]]-val[i];}int main(){ n=read(),S=read(); for(int i=1,u,v,w;i

  

转载于:https://www.cnblogs.com/JYYHH/p/11258074.html

你可能感兴趣的文章
用户故事——老师
查看>>
sgen.exe" exited with code 1.解决方法
查看>>
实验一
查看>>
Ubuntu配置SSH免密码登陆
查看>>
SOA
查看>>
UVA10561 Treblecross 组合游戏/SG定理
查看>>
查询Oracle定时Job
查看>>
root账户不能使用密码只能使用密钥远程登陆
查看>>
浅谈WPF中对控件的位图特效(虚化效果、外辉光效果)
查看>>
[翻译] TensorFlow Programmer's Guide之Frequently Asked Questions(问得频率最多的几个问题)...
查看>>
JavaWeb基础—会话管理之Cookie
查看>>
kettle学习笔记(六)——kettle转换步骤
查看>>
5、Node.js 回调函数
查看>>
由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例 解决办法...
查看>>
ActiveMQ之topic主题模式
查看>>
15 可视化工具 Navicat的简单使用
查看>>
神兵利器:Burpsuite工具分享与使用简介
查看>>
xml
查看>>
使用 Left Join 的一个错误说明
查看>>
[Java] Oracle的JDBC驱动的版本说明
查看>>