传送门

Atcoder

Solution

首先是几个引理:

  1. 重新定义权值\(val_i=max(a_i-b_i,0)\),那么通过这个点必须需要\(val_i+b_i\)的钱。
  2. 多次经过一个点一定是在最后一次捐赠。
  3. 我们按照\(val_i\)排序那么大的一定先访问。

第1个可以感性理解,第2个很显然,这里主要理性证明一下第3个引理:

设当前钱数为\(x\),先后经过\(i,j\)两个站点且\(a_i-b_i<a_j-b_j\)。

那么两种情况分别对应:

  1. \(x \ge b_i+a_j\)

  2. \(x \ge b_j+a_i\)

又因为\(a_i-b_i<a_j-b_j\),所以\(a_i+b_j<a_j+b_i\)。

所以走下面这种一定更优。

那么这个时候我们可以根据\(val_i\)将原图分成多个联通块,联通块内再分就是一棵树是吧(类似淀粉质)。

在这个树上\(dp\)即可。

考虑设\(f_i\)表示做完以\(i\)为根的子树的最小钱数,\(g_i=f_i-\sum_{son \in i}b_i\)。

我们很显然可以转移\(g\),然后再用\(g\)转移\(f\)即可。

Code

/*
mail: mleautomaton@foxmail.com
author: MLEAutoMaton
This Code is made by MLEAutoMaton
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define REP(a,b,c) for(int a=b;a<=c;a++)
#define re register
#define int ll
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi(){
int f=1,sum=0;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
return f*sum;
}
const int N=200010,Inf=1e18+10;
int n,m,a[N],b[N],sum[N],f[N],p[N],dp[N],vis[N];
int find(int x){return f[x]!=x?f[x]=find(f[x]):f[x];}
vector<int>G[N];
bool cmp(int A,int B){return a[A]<a[B];}
signed main(){
n=gi();m=gi();
for(int i=1;i<=n;i++){
a[i]=gi();b[i]=gi();a[i]=max(a[i]-b[i],0ll);
p[i]=f[i]=i;sum[i]=b[i];dp[i]=a[i];
}
for(int i=1;i<=m;i++){int u=gi(),v=gi();G[u].push_back(v);G[v].push_back(u);}
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++){
int u=p[i];vis[u]=1;
for(int v:G[u])
if(vis[v]){
int x=find(u),y=find(v);
if(x!=y){
f[y]=x;sum[x]+=sum[y];
dp[x]=min(dp[x],max(dp[y],a[x]-sum[y]));
}
}
}
printf("%lld\n",dp[find(1)]+sum[find(1)]);
return 0;
}

ARC098F Donation的更多相关文章

  1. 【ARC098F】Donation

    [ARC098F]Donation 题面 atcoder 题意: 给定一张\(n\)个点,\(m\)条边的无向图.这张图的每个点有两个权值 \(a_i,b_i\). 你将会从这张图中选出一个点作为起点 ...

  2. AtCoder Regular Contest 098 F.Donation

    传送门 首先,对于一个点i,进入这个点前必须大于等于Ai,每个点必须捐赠Bi 那么我们可以在每个点最后一次经过的时候再捐赠,这样显然更优 现在我们假设每个点都是最后一次经过的时候捐赠.现在我们把捐赠的 ...

  3. AT4144-[ARC098D]Donation【Kruskal重构树,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/AT4144 题目大意 \(n\)个点\(m\)条边的一张无向联通图,每个点有两个值\(a_i,b_i\).表示经过该 ...

  4. [atARC098F]Donation

    贪心,一定在最后一次经过某节点时付出$b_{u}$,条件是付出后$W\ge \max(a_{i}-b_{i},0)$(同时也可以仅考虑这个限制,因为$W$在过程中不会增大) 假设"最后一次经 ...

  5. Entity Framework 6 Recipes 2nd Edition(12-3)译 -> 数据库连接日志

    12-3. 数据库连接日志 问题 你想为每次与数据库的连接和断开记录日志 解决方案 EF为DbContext的连接公开了一个StateChange 事件.我们需要处理这个事件, 为每次与数据库的连接和 ...

  6. Using Celery with Djang

    This document describes the current stable version of Celery (4.0). For development docs, go here. F ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (44) ------ 第八章 POCO之POCO中使用值对象和对象变更通知

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-4  POCO中使用值对象(Complex Type--也叫复合类型)属性 问题 ...

  8. sublime text 3插件

    Package Control Messages Emmet emmet插件 Thank you for installing Emmet -- a toolkit that can greatly ...

  9. AAS代码第2章

    [root@node1 aas]# pwd /root/aas [root@node1 aas]# wget http://archive.apache.org/dist/spark/spark-1. ...

随机推荐

  1. 开源串口 Ymodem 上位机软件

    概述 上位机使用Qt开发,计划整合多个工具为一体,用作以后的调试工具. 当前完成功能: 1.串口调试 支持hex和ascii 码发送,接受. 支持自动添加回车换行. 支持定时发送,最短间隔100ms, ...

  2. PHP面试题2019年腾讯工程师面试题和答案

    一.单选题(共29题,每题5分) 1.PHP执行的时候有如下执行过程:Scanning(Lexing) - Compilation - Execution - Parsing,其含义分别为: A.将P ...

  3. 【转载】C#使用InsertRange方法往ArrayList集合指定位置插入另一个集合

    在C#的编程开发中,ArrayList集合是一个常用的非泛型类集合,ArrayList集合可存储多种数据类型的对象.在实际的开发过程中,我们可以使用InsertRange方法在ArrayList集合指 ...

  4. JS 正则表达式转换字符串

    获取第一个.前面的字符串,以及后面的字符串: const transform = str => { str.replace(/([^\.]*)\.(.*)/, function($0, $1,$ ...

  5. mysql 的逻辑架构 与 存储引擎的介绍

    mysql 的逻辑架构分为三层: 最上层的服务大多数基于网络的客户端.服务器的工具或者服务都有类似的架构,比如连接处理,授权认证.安全等 第二层架构:mysql的核心服务功能都在这一层,包括查询解析, ...

  6. 一招解决------VMware虚拟机 Centos7网络配置 ping:www.baidu.com:未知的名称或服务 ping不通

    一招解决------VMware虚拟机 Centos7网络配置 ping:www.baidu.com:未知的名称或服务 ping不通 1.首先点击VMware的编辑,再点击虚拟网路编辑器. 2.进入虚 ...

  7. Mycat配置项详解

     schema.xml文件配置中的balance属性和writeType属性: . balance=", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上. . ba ...

  8. Odoo搜素视图过滤器之筛选与分组

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826168.html 一:过滤器 搜索视图还可以包含<filter>元素,定制过滤器. 过滤器 ...

  9. Dockerfile(从无到有创建镜像)

    本文原始地址:https://sitoi.cn/posts/43818.html 结构 DockerFile分为四部分组成: 基础镜像信息 维护者信息 镜像操作指令 容器启动时执行指令 基础镜像信息 ...

  10. 我的GitHub:https://github.com/javaFesh?tab=repositories

    https://github.com/javaFesh?tab=repositories