题解

这显然是一道题拆成两道

然后我胡乱分析了一波,决定第一题就用点度贪心(反正散播的能量肯定能被使用),然后过了

第二题开始mengbier
设\(f_u\)表示第u个点在父亲发动之后才发动的最小价值
\(g_u\)表示第u个点在父亲发动之前发动最小价值

转移的时候
\(son_f\)表示在父亲发动之后才发动的儿子
\(son_g\)表示在儿子发动之后才发动的父亲
\(f_u = \sum_{v \in son_f} f_v + \sum_{t \in son_g} g_t + d_u - c_{fa} - \sum_{t \in son_g} c_t\)
\(g_u = \sum_{v \in son_f} f_v + \sum_{t \in son_g} g_t + d_u - \sum_{t \in son_g} c_t\)
只需要用一个背包\(h[i][j]\)求出来选到第i个儿子能给父亲的额外能量为j的最小代价
分组背包,f和g只能选一个且必须选,转移比较显然

代码

#include <bits/stdc++.h>
#define enter putchar('\n')
#define space putchar(' ')
#define pii pair<int,int>
#define fi first
#define se second
#define MAXN 100005
#define pb push_back
#define mp make_pair
#define eps 1e-8
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {res = 0;T f = 1;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f;
}
template<class T>
void out(T x) {if(x < 0) {x = -x;putchar('-');}if(x >= 10) out(x / 10);putchar('0' + x % 10);
}
struct node {int to,next;
}E[MAXN * 2];
int head[MAXN],sumE,N,C[MAXN],D[MAXN];
void add(int u,int v) {E[++sumE].to = v;E[sumE].next = head[u];head[u] = sumE;
}
void Init() {read(N);for(int i = 1 ; i <= N ; ++i) read(D[i]);for(int i = 1 ; i <= N ; ++i) read(C[i]);int u,v;for(int i = 1 ; i < N ; ++i) {read(u);read(v);add(u,v);add(v,u);}
}
namespace task1 {int ind[MAXN];set<pii > S;void spread(int u) {D[u] = 0;for(int i = head[u] ; i ; i = E[i].next) {int v = E[i].to;if(D[v]) {--ind[v];if(C[u]) --D[v];if(!D[v]) spread(v);else if(C[v]) S.insert(mp(ind[v],v));}}}void Solve() {for(int u = 1 ; u <= N ; ++u) {for(int i = head[u] ; i ; i = E[i].next) {++ind[u];}}for(int u = 1 ; u <= N ; ++u) {if(C[u] == 1) S.insert(mp(ind[u],u));}int ans = 0;while(S.size()) {pii p = *S.begin();S.erase(S.begin());if(p.fi != ind[p.se] || !D[p.se]) continue;ans += D[p.se];D[p.se] = 0;spread(p.se);}for(int u = 1 ; u <= N ; ++u) ans += D[u];out(ans);enter;}
}
namespace task2 {int f[2005],g[2005],h[10005];void dfs(int u,int fa) {for(int i = head[u] ; i ; i = E[i].next) {int v = E[i].to;if(v != fa) dfs(v,u);}int siz = 0;h[0] = 0;for(int i = head[u] ; i ; i = E[i].next) {int v = E[i].to;if(v != fa) {for(int j = siz + 1; j <= siz + C[v] ; ++j) h[j] = 1000000000;siz += C[v];for(int k = siz ; k >= 0 ; --k) {if(k >= C[v]) h[k] = min(h[k - C[v]] + g[v],h[k] + f[v]);else h[k] = h[k] + f[v];}}}f[u] = g[u] = 1000000000;for(int i = 0 ; i <= siz ; ++i) {f[u] = min(f[u],h[i] + max(D[u] - i - C[fa],0));g[u] = min(g[u],h[i] + max(D[u] - i,0));}}void Solve() {dfs(1,0);out(min(f[1],g[1]));enter;}
}
int main() {
#ifdef ivorysifreopen("f1.in","r",stdin);
#endifInit();int maxc = 0;for(int i = 1 ; i <= N ; ++i) maxc = max(maxc,C[i]);if(maxc <= 1) task1::Solve();else task2::Solve();return 0;
}

转载于:https://www.cnblogs.com/ivorysi/p/9496335.html

【LOJ】#2041. 「SHOI2015」聚变反应炉相关推荐

  1. Loj #2036. 「SHOI2015」自动刷题机

    link : https://loj.ac/problem/2036 这个显然具有单调性,N小的话更容易A题,不仅因为A一次题减少的代码,并且A题的下限也低. 所以直接上二分就行了,注意上限一定不要设 ...

  2. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  3. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  4. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

  5. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

  6. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  7. LOJ#2145. 「SHOI2017」分手是祝愿

    LOJ#2145. 「SHOI2017」分手是祝愿 题目描述 Solution 首先有一个结论: 灯的状态序列a1,a2...ana_1,a_2...a_na1​,a2​...an​唯一对应了一个最优 ...

  8. Loj #2568. 「APIO2016」烟花表演

    Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...

  9. Loj #2585. 「APIO2018」新家

    Loj #2585. 「APIO2018」新家 题目描述 五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示.小明是一位时光旅行者,他知道在这条街上,在过去现 ...

最新文章

  1. python列表字典_Python常用对字典、列表的操作
  2. 车辆抵押贷款风险分析
  3. mysql插入报主键冲突,解决方法主键索引重新排序
  4. 《算法问题实战策略》-chaper21-树的实现和遍历
  5. 简单的php cms,30个很棒的PHP开源CMS内容管理系统
  6. 微信小程序开发-云数据库添加及获取显示
  7. FreeSwitch双轨录音
  8. compiled.php,laravel compiled.php 缓存 命令行
  9. 开机时自动启动的AutoHotkey脚本 2019年07月08日19时06分
  10. Linux内核学习笔记——Linux中的用户组和权限管理(UID是什么?)
  11. Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data-----阅读阶段
  12. 华为Ascend:进一步做好产品差异化是后续重点
  13. 设置状态栏颜色、沉浸式状态栏
  14. 开源搜索项目-倒排索引代码解析(一)
  15. 编程练习题 没答案版
  16. ue4种上树木 草地
  17. 一系列令人敬畏的.NET核心库,工具,框架和软件
  18. Vue项目硅谷外卖(一)项目准备
  19. 什么是Webshell?
  20. 【面试系列】面试中项目如何准备?

热门文章

  1. 个人信息安全隐患防范意识
  2. [转]王齐前辈写的一篇随笔
  3. Sharp_GP2Y0A 红外测距传感器 Arduino读取
  4. 【重要通知】起床困难户:这个闹钟 App,彻底治好了我的拖延症、收藏收藏
  5. ps2022 - add text
  6. 龙兵汽车4S店系统v1.10.15 汽车销售 汽车营销 汽车小程序
  7. 计算机科学ba bs区别,美国读大学选专业BA和BS有什么区别?
  8. 佳能hdr_神奇风物在哪里?佳能EOS R专微HDR大片攻略
  9. Adobe认证证书怎么考?
  10. 如何维护计算机系统的安全,冰冻精灵应该如何正确使用,长期维护电脑系统安全...