【题解】POI2014FAR-FarmCraft
2024-08-28 13:55:38
这题首先手玩一下一下数据,写出每个节点修建软件所需要的时间和到达它的时间戳(第一次到达它的时间),不难发现实际上就是要最小化这两者之和。然后就想到:一棵子树内,时间戳必然是连续的一段区间,而如果将访问到子树根节点的时间看做0时,则是一段0~x的连续时间,与其他子树的分配无关。所以自然的联想到单独处理出dp[u]:以u为根节点,访问时间看做0的时候其中节点所需要的时间最大值。
如何从dp[v]转移到dp[u]?首先随便给它们分配一个顺序,则每一个节点的最后最大值(原先的值建立在访问根节点的时间为0的基础上,但现在的根节点变成了原来根节点的父亲)=原来的dp值+分配的顺序所带来的时间差。我们分析应怎样分配这个顺序使得它们的最大值最小。
我们有
dp[u] = max{ dp[a] , dp[b] + size[a] + 2 };
dp[u] = max{ dp[u] , max{ dp[b], dp[a] + size[b] + 2 }}; // size[x] 代表访问x子树的全部节点所需要的时间
这个应该不难看出:实际上就是枚举了两种情况。那么如果第一次取得的值要小于第二次取得的值,我们就认为将第一个放在第二个前面是更优的。之所以+2,是因为由u->v的边还需要经过2次。
// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
#define maxn 600000
#define int long long
int n, a[maxn], size[maxn];
int cnp = , dp[maxn], head[maxn]; int read()
{
int x = ;
char c;
c = getchar();
while(c < '' || c > '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} struct node
{
int id, num, s;
}P[maxn]; struct edge
{
int to, last;
}E[maxn * ]; bool cmp (node a, node b)
{
int p = max(a.num, b.num + a.s + );
int q = max(b.num, a.num + b.s + );
return p < q;
} void add(int u, int v)
{
E[cnp].to = v, E[cnp].last = head[u]; head[u] = cnp ++;
} void DP(int u, int fa)
{
if(u != ) dp[u] = a[u];
for(int i = head[u]; i; i = E[i].last)
{
int v = E[i].to;
if(v == fa) continue;
DP(v, u);
}
int tot = , last = ;
for(int i = head[u]; i; i = E[i].last)
if(E[i].to != fa) P[++ tot] = (node) {E[i].to, dp[E[i].to], size[E[i].to]};
if(tot)
{
sort(P + , P + + tot, cmp);
for(int i = ; i <= tot; i ++)
{
int v = P[i].id;
dp[u] = max(dp[u], dp[v] + (size[u] + ));
size[u] += size[v] + ;
}
}
} signed main()
{
n = read();
for(int i = ; i <= n; i ++) a[i] = read();
for(int i = ; i < n; i ++)
{
int x = read(), y = read();
add(x, y), add(y, x);
}
DP(, );
printf("%lld\n", max(dp[], (n - ) * + a[]));
return ;
}
最新文章
- iOS视频边下边播--缓存播放数据流
- NSThread 子线程 Cocoa NSOperation GCD(Grand Central Dispatch) 多线程
- eclipse汉化过程
- final修饰符,finally,finalize区别
- 使用MFC读写Excel
- Eclipse中为什么创建DynamicWebProject后没有默认的web.xml文件?
- (四) Keras Dropout和正则化的使用
- 移动终端设备ID
- 500 : Internal Server Error(jupyter)
- yum upgrade卡在 清理initial-setup-0.3.9.30-1.el7.centos.x86_64
- 精确值避免使用float和double,使用BigDecimal
- VirtualBox安装CentOS7的网络配置
- TypeScript 知识点
- Django 模板语言 路由 视图
- 使用httpclient下载 页面、图片
- Ansible 从MySQL数据库添加或删除用户
- 3. IP地址转换函数
- 开源爬虫Labin,Nutch,Neritrix介绍和对比
- 编程之美 set 13 光影切割问题
- SharePoint 2013 - REST API about Security
热门文章
- http协议中的状态码(status code),超文本传输协议状态码
- 【坑】记录一个docker 1.13.1 build 07f3374 版本的坑
- 【PHP项目】产品新增的多图上传
- Mysql 5.7 开启远程连接
- ExceL按记录导出Txt 工具
- STM32进阶之串口环形缓冲区实现(转载)
- 小米Pro 15.6 系统重装记录
- Angularjs+bootstrap 实现横向滑屏
- 一个适合变化的产品部署集成包(nginx+jdk+tomcat+nodejs+mysql+redis+mongo+MYSQL主主(读写分离)集群建立+代码包+持续上线+备份)
- Django信号的使用