传送门

首先,对于一个点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++使用BOOST操作文件、目录

    开始使用 在BOOST库出现之前,C++对于文件和目录的操作,大都借助于UNIX提供的底层文件和目录接口,从使用角度来看,这些底层的操作不够友好.BOOST中filesystem库是一种可移植的文件系 ...

  2. MVC 接收参数时会自动解码

    MVC在接收传递过来的参数时,会自动对参数进行解码,无需手动解码 例: public ActionResult SendMsg2(string name) { return Content(name) ...

  3. ZT————pull push mode

    谁能讲讲push和pull模式是什么意思?(参与有分) [问题点数:100分,结帖人mickeyfirst] 收藏 mickeyfirst mickeyfirst 等级: 结帖率:94.12% 楼主 ...

  4. webpack学习(三)html-webpack-plugin插件

    一.html-webpack-plugin插件 简单创建 HTML 文件,用于服务器访问 例如:我们要为输出文件添加哈希值标记,避免老的不变的文件重新加载,避免新修改的文件受缓存影响. 在前后两次在终 ...

  5. 使用combineReducers注意事项

    一.从‘redux’包中引入combineReducers方法: import { combineReducers } from 'redux'; 二.针对state的不同属性写不同的reducer, ...

  6. JavaScript的DOM_获取和操作层次节点

    一.层次节点的概述 节点的层次结构可以划分为:父节点与子节点.兄弟节点这两种.当我们获取其中一个元素节点的时候,就可以使用层次节点属性来获取它相关层次的节点. 二.childNodes 属性 chil ...

  7. 代码注释模板(把内容保存为xml文件,导入eclipse中即可)

    <?xml version="1.0" encoding="UTF-8" standalone="no"?><templa ...

  8. LRU缓存算法与pylru

    这篇写的略为纠结,算法原理.库都是现成的,我就调用了几个函数而已,这有啥好写的?不过想了想,还是可以介绍一下LRU算法的原理及简单的用法.   LRU(Least Recently Used,最近最少 ...

  9. 1.Jdeveloper打印出完整日志(-Djbo.debugoutput=console)

    有时候在JDeveloper中需要打印出来比较系统和完整的ADF运行时日志 例如,想查看VO当前执行的是哪个View Criteria,运行的完整SQL语句到底如何 以及当前Binding Varia ...

  10. Selenium基础知识(元素定位的调试)

    对一个不能直接定位的元素来说,调试是很常见的事,所以这里也简单总结了一下. 调试定位元素的工具很多,介绍也多,就不一一介绍了.下次有时间再补充.以下是我常用调试的方法(浏览器自带的控制台调试,仅介绍一 ...