传送门

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. .NET CORE 动态加载 DLL 的问题

    有个系统, 需要适应不同类型的数据库(同时只使用其中一种),如果把数据库操作层提取出来,然后针对不同的数据库使用不同的 DLL, 再根据不同的项目使用不同的库, 在以前的 ASP.NET 中, 直接把 ...

  2. elementUi vue el-radio 监听选中变化

    //change是radio-group标签的事件 <div> <el-radio-group v-model="radioSex" @change=" ...

  3. java接口中的成员方法和成员变量

    接口的含义理解:接口可以理解成统一的"协议",而接口中的属性也属于协议中的内容;但是接口的属性都是公共的,静态的,最终的 接口的成员特点:A:成员变量 只能是常量.默认修饰符 pu ...

  4. CSS 基础样式

    文本 p{ font-family:Cambria, "Hoefler Text", "Liberation Serif", Times, "Time ...

  5. HTTP 强制缓存和协商缓存

    Web 缓存能够减少延迟与网络阻塞,进而减少显示某个资源所用的时间.借助 HTTP 缓存,Web 站点变得更具有响应性. 缓存优点: 减少不必要的数据传输,节省带宽 减少服务器负担,提升网站性能 加快 ...

  6. sparkContext的初始化过程

    SparkContext 初始化的过程主要的核心:1) 依据 SparkContext 的构造方法中的参数 SparkConf 创建一个SparkEnv2) 初始化,Spark UI,以便 Spark ...

  7. sqlite3 FTS全文索引按照相关性排序

    PS.后来发现,以下代码并不准确.请大家不要试了. -------以下是原内容------------------------------------------------------------- ...

  8. python url合并与分离

     #!/bin/python3 from urllib import parse parse.urlsplit() 将url分为6个部分,返回一个包含6个字符串项目的元组:协议.位置.路径.参数.查询 ...

  9. HTML通用模板

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. (十)Kubernetes ConfigMap和Secret

    ConfigMap资源 介绍 ConfigMap是让配置文件从镜像中解耦,让镜像的可移植性和可复制性.许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.这些配置信息需要与docker im ...