传送门

首先,对于一个点i,进入这个点前必须大于等于Ai,每个点必须捐赠Bi

那么我们可以在每个点最后一次经过的时候再捐赠,这样显然更优

现在我们假设每个点都是最后一次经过的时候捐赠。现在我们把捐赠的钱排除在外,对于每个点来说,需要max(Ai-Bi, 0)才能经过这个点

显然,max(Ai-Bi, 0)越大的点需要尽快到达,不然后面钱越来越少,就搞不定了

如果遵循这个规律,优先走max(Ai-Bi, 0)大的点。对于每一点,步骤可以概括为走完所有的子图(剩一个不走),显然这个过程不需要耗费钱财(因为父节点max(Ai-Bi, 0)最大),最后走剩下的那个子图,也就是说讨论选哪个字图最后走比较合适

所以我们采用树dp,从上往下构建一个递减的树

(我觉得我还是很难说明白,如果还不懂,可以看下代码或者官方题解)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
typedef long long ll;
using namespace std;
const int N = 1e5+5; int n, m;
vector<int> E[N];
int A[N], B[N], pos[N], vis[N], fa[N];
long long sum[N], add[N];
inline bool cmp(int x, int y) { return A[x] < A[y]; }
inline int find(int x) { return (x == fa[x]) ? x : (fa[x] = find(fa[x])); }
int main() {
while(~scanf("%d %d", &n, &m)) {
for(int i = 1; i <= n; ++i) E[i].clear();
for(int i = 1; i <= n; ++i) {
pos[i] = i; vis[i] = 0; fa[i] = i;
scanf("%d %d", &A[i], &B[i]);
A[i] = max(0, A[i] - B[i]);
add[i] = A[i];
sum[i] = B[i];
} sort(pos+1, pos+n+1, cmp);
for(int i = 0; i < m; ++i) {
int a, b; scanf("%d %d", &a, &b);
E[a].push_back(b);
E[b].push_back(a);
} for(int i = 1; i <= n; ++i) {
vis[pos[i]] = 1;
for(int j = 0; j < E[pos[i]].size(); ++j) {
int tt = E[pos[i]][j];
if(vis[tt]) {
int f1 = find(pos[i]); int f2 = find(tt);
if(f1 != f2) {
sum[f1] += sum[f2];
fa[f2] = f1;
add[f1] = min(add[f1], add[f2] + max(0ll, A[f1] - add[f2] - sum[f2]));
}
}
}
}
printf("%lld\n", sum[pos[n]] + add[pos[n]]);
}
return 0;
}

AtCoder Regular Contest 098 F.Donation的更多相关文章

  1. AtCoder Regular Contest 098

    AtCoder Regular Contest 098 C - Attention 题意 给定一个只包含"E","W"字符串,可以花一的花费使他们互相转换.选定 ...

  2. AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图

    AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...

  3. AtCoder Regular Contest 074 F - Lotus Leaves

    题目传送门:https://arc074.contest.atcoder.jp/tasks/arc074_d 题目大意: 给定一个\(H×W\)的网格图,o是可以踩踏的点,.是不可踩踏的点. 现有一人 ...

  4. AtCoder Regular Contest 081 F - Flip and Rectangles

    题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列 ...

  5. AtCoder Regular Contest 066 F Contest with Drinks Hard

    题意: 你现在有n个题目可以做,第i个题目需要的时间为t[i],你要选择其中的若干题目去做.不妨令choose[i]表示第i个题目做不做.定义cost=∑(i<=n)∑(i<=j<= ...

  6. AtCoder Regular Contest 076 F - Exhausted?

    题意: n个人抢m个凳子,第i个人做的位置必须小于li或大于ri,问最少几个人坐不上. 这是一个二分图最大匹配的问题,hall定理可以用来求二分图最大匹配. 关于hall定理及证明,栋爷博客里有:ht ...

  7. AtCoder Regular Contest 067 F - Yakiniku Restaurants

    题意: 有n个餐厅排成一排,第i个与第i+1个之间距离是Ai. 有m种食物,每种食物只能在一个餐厅里吃,第j种食物在第i个餐厅里吃的收益是$b[i][j]$. 选择每种食物在哪个餐厅里吃,使收益减去走 ...

  8. AtCoder Regular Contest 059 F Unhappy Hacking

    Description 题面 Solution 我们发现如果一个位置需要被退掉,那么是 \(0\) 或 \(1\) 都没有关系 于是我们想到把 \(0,1\) 归为一类 问题转化为每一次可以添加和删除 ...

  9. 【推导】【模拟】AtCoder Regular Contest 082 F - Sandglass

    题意:有个沙漏,一开始bulb A在上,bulb B在下,A内有a数量的沙子,每一秒会向下掉落1.然后在K个时间点ri,会将沙漏倒置.然后又有m个询问,每次给a一个赋值ai,然后询问你在ti时刻,bu ...

随机推荐

  1. 你所不知道的C和C++运行库 标签: vc 2017-05-26 10:33 41人阅读 评论(0) 收藏

    在使用vs2013调用vc2005编译出的dll时出现错误,遂将源程序用vs2013编译出dll,再用vs2013调用错误消失,不解.寻找原因时有人说"VC库版本不一样",故查找C ...

  2. tree 向下查找 (删除整条tree)

    需求:通过点击获取需要删除的id(即获取到整条信息),如果该条数据没有子集,通过id删除即可,如果有子集,则该数据下所有的子集都需要删 删除后页面的数据更新在 下一篇 讲解 1 const id =' ...

  3. awrsqrpt.sql简介

    ORACLE_HOME/RDBMS/admin/awrsqrpt.sql  这个脚本可以很方便地取出某个sql在某两个快照间隔内,消耗cpu时间,执行次数,逻辑读,物理读,sql的执行计划以及sql的 ...

  4. css文本过长如何设置省略号

    对于单行文本: 语法:  text-overflow : clip | ellipsis  参数:  clip : 不显示省略标记(...),而是简单的裁切  (clip这个参数是不常用的!)  el ...

  5. July 20th 2017 Week 29th Thursday

    The darkness is no darkness with you. 有了你,黑暗将不再是黑暗. The darkness will not be driven out if we failed ...

  6. 正则工具类 -- RegexUtils

    import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util. ...

  7. bzoj3609 [Heoi2014]人人尽说江南好

    Description 小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏狂热玩家),最近他 想起了小时候在江南玩过的一个游戏.    在过去,人们是要边玩 ...

  8. C#利用NPOI处理excel的类 NPOIHelper.cs

    个人的NPOIHelp类,包括datatable导出到excel,dataset导出到excel,excel导入到datatable,excel导入到dataset, 更新excel中的数据,验证导入 ...

  9. 一段基于Redis-SortedSet的限流代码

    [HttpGet] public async Task<ActionResult<string>> Get() { //限流周期:5秒 int period = 5; //周期 ...

  10. Linux关于压缩和解压缩实例

    在谈到压缩和解压缩,我想说说它们的应用场景,其实它们主要的应用场景是有这么几个方面? (1)备份(几十个数据库每天进行备份,即包含数据又包含脚本,还有其他十分重要的日志文件等等); (2)降低服务器存 ...