P4629 [SHOI2015] 聚变反应炉

题目

传送门

\(d_i\) 表示初始使用的能量,如果你处理了这个点,就可以把相邻的点所需的能量减去 \(c_i\)

思路

\(50\%\) 的数据为 \(\max\{c_i\}=1,n\le10^5\)

因为最大的 \(c_i\) 只有 \(1\),我们可以考虑贪心

首先,我们肯定先处理 \(c_i=1\) 的点,我们要考虑处理的顺序,不管顺序怎么变,迟早会把该节省的节省掉

int sum = 0;
for (int i = 1; i <= n; ++i)
{if (c[i] == 0)continue;vis[i] = 1;for (int v : e[i])if (!vis[v]) --d[v];
}
for (int i = 1; i <= n; ++i)sum += max(d[i], 0);

\(50\%\) 的数据,我们就要考虑使用树形dp (就是个背包)

定义

\(f[u][0/1]\) 表示当前节点是否在父节点之前处理完

\(g[i][0/1]\) 表示节省 \(i\) 元的最小花费

对于 \(g\) 的详细操作

int sz = c[fa];
for (int i = 0; i <= sz; ++i) g[i][0] = g[i][1] = inf;
g[0][1] = g[c[fa]][0] = 0;
for (int v : e[u])
{if (v == fa) continue;for (int i = sz + 1; i <= sz + c[v]; ++i) g[i][0] = g[i][1] = inf;sz += c[v];for (int i = sz; i >= 0; --i){if (i < c[v]){g[i][0] += f[v][0];g[i][1] += f[v][0];}else{g[i][0] = min(f[v][0] + g[i][0], f[v][1] + g[i - c[v]][0]);g[i][1] = min(f[v][0] + g[i][1], f[v][1] + g[i - c[v]][1]);}}
}

得到\(g\)之后就好处理了,我们可写出如下转移

\(\displaystyle f[u][0] = \min_{i=1}^{sz}\{g[i][0]+\max\{0,d[u]-i\}\}\)

\(\displaystyle f[u][1] = \min_{i=1}^{sz}\{g[i][1]+\max\{0,d[u]-i\}\}\)

代码

#include <bits/stdc++.h>  #define ll long long  
#define PII pair<int, int>  
using namespace std;  
const int inf = 0x3f3f3f3f;  
const int MOD = 1e9 + 7, N = 1e5 + 5;  
int n, d[N], c[N];  
vector<int> e[N];  
namespace pts1  
{  int f[N][2], g[N][2];  void dfs(int u, int fa)  {  for (int v: e[u])  {  if (v == fa) continue;  dfs(v, u);  }  int sz = c[fa];  for (int i = 0; i <= sz; ++i) g[i][0] = g[i][1] = inf;  g[0][1] = g[c[fa]][0] = 0;  for (int v: e[u])  {  if (v == fa) continue;  for (int i = sz + 1; i <= sz + c[v]; ++i) g[i][0] = g[i][1] = inf;  sz += c[v];  for (int i = sz; i >= 0; --i)  {  if (i < c[v])  {  g[i][0] += f[v][0];  g[i][1] += f[v][0];  } else  {  g[i][0] = min(f[v][0] + g[i][0], f[v][1] + g[i - c[v]][0]);  g[i][1] = min(f[v][0] + g[i][1], f[v][1] + g[i - c[v]][1]);  }  }  }  f[u][0] = g[0][0] + d[u], f[u][1] = g[0][1] + d[u];  for (int i = 1; i <= sz; ++i)  {  f[u][0] = min(f[u][0], g[i][0] + max(0, d[u] - i));  f[u][1] = min(f[u][1], g[i][1] + max(0, d[u] - i));  }  }  void solve()  {  dfs(1, 0);  printf("%d", f[1][1]);  }  
};  namespace pts2  
{  int vis[N];  void solve()  {  int sum = 0;  for (int i = 1; i <= n; ++i)  {  if (c[i] == 0)  continue;  vis[i] = 1;  for (int v: e[i])  if (!vis[v]) --d[v];  }  for (int i = 1; i <= n; ++i)  sum += max(d[i], 0);  printf("%d", sum);  }  
};  signed main()  
{  int maxx = 0;  scanf("%d", &n);  for (int i = 1; i <= n; ++i)  scanf("%d", &d[i]);  for (int i = 1; i <= n; ++i)  scanf("%d", &c[i]), maxx = max(maxx, c[i]);  for (int i = 1, u, v; i < n; ++i)  {  scanf("%d%d", &u, &v);  e[u].push_back(v);  e[v].push_back(u);  }  if (maxx <= 1) pts2::solve();  else pts1::solve();  return 0;  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/772486.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态内存分配的策略研究

使用Carnegie Mellon University提供的C语言模拟代码为测试,验证多种分配策略的特性,为设计新的更高效的算法进行探路,工程文件附于文章末尾。 基本宏定义 阅读C语言测试模型,得到基本分配块的结构约定。#define ALIGNMENT 8 //校准字长,4或8 #define ALIGN(size…

Naplespu微体系结构内多个插件融合分析(草稿)

Naplespu微体系结构内多个插件融合分析(草稿) http://www.naplespu.com/doc/index.php?title=Detailed_studies 介绍 打算展示替换链是如何相对于L2缓存发生的,观察目录控制器是如何演变以管理此类情况的发生的。主要目的是测试发生L2替换的所有情况,如图所示:目录控制器…

python-if elif嵌套结构

if 条件:if语句块 elif 条件:elif语句块 else:else语句块 示例:

python-换行

a=10+\20+\30 #\是换行符print(a)b=(10+20+30) #括号换行 print(b)

浅谈 I/O 与 I/O 多路复用

1.基础知识网络编程里常听到阻塞IO、非阻塞IO、同步IO、异步IO等概念,总听别人聊不如自己下来钻研一下。不过,搞清楚这些概念之前,还得先回顾一些基础的概念。下面说的都是Linux环境下,跟Windows环境不一样哈☺。1.1 用户空间和内核空间现在操作系统都采用虚拟寻址,处理器…

服务器性能监控系统安装与配置手册

服务器性能监控系统安装与配置手册 1. 前言 本手册旨在指导用户安装与配置服务器性能监控系统,并介绍系统的主要功能及使用方式。 2. 系统概述 本系统采用 [系统名称] 作为核心监控组件,并结合 [其他组件] 实现服务器性能的实时监控、告警和数据分析。 3. 系统架构监控节点: …

Java学习Day3_上 总结

1.算术运算符: %运算: a % b = a - a / b * b 2.关系运算符: 返回值是boolean类型. 3.逻辑运算符: PASS 4.三元运算符: 条件表达式 ? : 表达式1:表达式2; public class ThreeEye {public static void main(String arg[]) {int a = 1, b = 2;int c = a > b ? a : b;System…

太卷了,阿里云免费1个月大模型算力额度,玩转Llama3.1/Qwen2等训练推理

阿里云百炼平台发布推文,提供30天免费算力额度,助力玩转 Llama3.1 训练推理。老牛同学首当其冲,去体验一把,本文详细记录了整个过程,同时给出了老牛同学的一些想法,欢迎交流学习……早上收到朋友转发的阿里云公众号推文,阿里云为用户免费提供 1 个月的训练推理等算力额度…

【待做】【攻防技术系列+免杀】从零学习Webshell免杀

项目简介 这是一本能让你从零开始学习PHP的WebShell免杀的手册 博客地址: https://blog.zgsec.cn/index.php/archives/197/项目描述 一、PHP相关资料 PHP官方手册: https://www.php.net/manual/zh/PHP函数参考: https://www.php.net/manual/zh/funcref.php菜鸟教程: https:…

如何配置 pglogical | PostgreSQL 的流复制

pglogical 扩展为 PostgreSQL 提供逻辑流复制 我们使用以下术语来描述节点之间的数据流,有意重复使用早期的 Slony 技术: • 节点 - PostgreSQL 数据库实例 • 提供者和订阅者 - 节点承担的角色 • 复制集- 表的集合 建筑细节: • pglogical在每个数据库级别上工作,而不是像…

Go语言结构体(struct)面向对象编程基础篇

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.面向对象的引入1.Golang语言面向对象编程2.结构体的引入3.结构体定义4.结构体五种初始化方式5.结构体的互相转换6.匿名结构体二.结构体方法定义1.方法概述2.方法是值拷贝传递方式3.指针类型的接收者4.…

Linux的权限控制

本章将和大家分享Linux中的权限控制。本章将和大家分享Linux中的权限控制。废话不多说,下面我们直接进入主题。 一、基础知识 Linux作为一种多用户的操作系统(服务器系统),允许多个用户同时登陆到系统上,并响应每个用户的请求。 任何需要使用操作系统的用户,都需要一个系统…