[atARC098F]Donation
贪心,一定在最后一次经过某节点时付出$b_{u}$,条件是付出后$W\ge \max(a_{i}-b_{i},0)$(同时也可以仅考虑这个限制,因为$W$在过程中不会增大)
假设“最后一次经过”的顺序为$p_{1},p_{2},...,p_{n}$,则要保证存在$p_{i}$到$p_{i+1}$的路径不经过$p_{1},...,p_{i-1}$,也即对于任意一个后缀,其点集的导出子图连通
倒序模拟这个过程(因为有连通的限制),二分枚举$d=W-\sum_{i=1}^{n}b_{i}$,那么可以看作从一个点($p_{n}$)开始拓展,找到相邻的$x$满足$d\ge a_{x}-b_{x}$,则可以拓展$x$(作为$p_{n-1}$),重复此过程直至拓展整张图
由于拓展只会增加$d$,因此可以贪心拓展,用优先队列维护最小的$a_{x}-b_{x}$去拓展一定最优,此时时间复杂度为$o(n^{2}\log^{2}n)$(因为要枚举$p_{n}$,还有优先队列),无法通过
仍然先枚举$p_{n}$,令$v$为$a_{v}-b_{v}$最大的位置,$G'$为删除$v$后$p_{n}$所在的连通块,从上面的过程来看,在这个贪心下,只有拓展完$G'$后才可能拓展$v$,同时当拓展完$v$后整张图一定都可以拓展
因此,合法条件变为两个:1.$G'$能拓展完;2.$G'$拓展完后$d\ge a_{v}-b_{v}$,前者是一个子问题,可以继续找到最大的$v'$来处理,直至最后$|V|=1$(即为起点)
将这个结构构成一棵树(类似点分树,只是将重心换成$a_{v}-b_{v}$最大的位置),根据上面的条件,即要求找到$a_{x}-b_{x}\le d$的位置,满足$s_{x}+d\ge a_{fa}-b_{fa}$(其中$s_{x}$为$x$子树中$b$的和)直至根
如何建出这棵树,可以从小到大枚举$a_{i}-b_{i}$,然后去合并相邻且比他小的位置作为儿子,再用并查集维护即可
由于后者的条件与起点关系不大,可以看作从根出发,找到合法且$a_{x}-b_{x}$最小的位置,判断与$d$的大小即可,此时时间复杂度为$o(n\log n)$
还可以枚举起点的位置来做到$o(n)$,即先忽略$a_{x}-b_{x}\le d$的限制,求出每一个位置上最小的$d$,记为$f_{k}$,转移为$f_{k}=\max(f_{fa},a_{fa}-b_{fa}-s_{k})$,答案为$\min_{1\le i\le n}\max(f_{i},a_{i}-b_{i})$

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define ll long long
5 struct ji{
6 int nex,to;
7 }edge[N<<1];
8 vector<int>v[N];
9 int E,n,m,x,y,ans,head[N],a[N],id[N],rk[N],fa[N],f[N];
10 ll s[N];
11 bool cmp(int x,int y){
12 return a[x]<a[y];
13 }
14 void add(int x,int y){
15 edge[E].nex=head[x];
16 edge[E].to=y;
17 head[x]=E++;
18 }
19 int find(int k){
20 if (k==fa[k])return k;
21 return fa[k]=find(fa[k]);
22 }
23 void merge(int x,int y){
24 x=find(x),y=find(y);
25 if (x!=y){
26 fa[x]=y;
27 s[y]+=s[x];
28 v[y].push_back(x);
29 }
30 }
31 void dfs(int k){
32 ans=min(ans,max(f[k],a[k]));
33 for(int i=0;i<v[k].size();i++){
34 f[v[k][i]]=f[k];
35 if (a[k]>s[v[k][i]])f[v[k][i]]=max(f[k],(int)(a[k]-s[v[k][i]]));
36 dfs(v[k][i]);
37 }
38 }
39 int main(){
40 scanf("%d%d",&n,&m);
41 memset(head,-1,sizeof(head));
42 for(int i=1;i<=n;i++){
43 scanf("%d%lld",&a[i],&s[i]);
44 a[i]=max(a[i]-s[i],0LL);
45 id[i]=fa[i]=i;
46 }
47 sort(id+1,id+n+1,cmp);
48 for(int i=1;i<=n;i++)rk[id[i]]=i;
49 for(int i=1;i<=m;i++){
50 scanf("%d%d",&x,&y);
51 add(x,y);
52 add(y,x);
53 }
54 for(int i=1;i<=n;i++)
55 for(int j=head[id[i]];j!=-1;j=edge[j].nex)
56 if (rk[edge[j].to]<i)merge(edge[j].to,id[i]);
57 ans=a[id[n]];
58 dfs(id[n]);
59 printf("%lld",ans+s[id[n]]);
60 }
[atARC098F]Donation的更多相关文章
- 【ARC098F】Donation
[ARC098F]Donation 题面 atcoder 题意: 给定一张\(n\)个点,\(m\)条边的无向图.这张图的每个点有两个权值 \(a_i,b_i\). 你将会从这张图中选出一个点作为起点 ...
- AtCoder Regular Contest 098 F.Donation
传送门 首先,对于一个点i,进入这个点前必须大于等于Ai,每个点必须捐赠Bi 那么我们可以在每个点最后一次经过的时候再捐赠,这样显然更优 现在我们假设每个点都是最后一次经过的时候捐赠.现在我们把捐赠的 ...
- ARC098F Donation
传送门 Atcoder Solution 首先是几个引理: 重新定义权值\(val_i=max(a_i-b_i,0)\),那么通过这个点必须需要\(val_i+b_i\)的钱. 多次经过一个点一定是在 ...
- AT4144-[ARC098D]Donation【Kruskal重构树,dp】
正题 题目链接:https://www.luogu.com.cn/problem/AT4144 题目大意 \(n\)个点\(m\)条边的一张无向联通图,每个点有两个值\(a_i,b_i\).表示经过该 ...
- Entity Framework 6 Recipes 2nd Edition(12-3)译 -> 数据库连接日志
12-3. 数据库连接日志 问题 你想为每次与数据库的连接和断开记录日志 解决方案 EF为DbContext的连接公开了一个StateChange 事件.我们需要处理这个事件, 为每次与数据库的连接和 ...
- Using Celery with Djang
This document describes the current stable version of Celery (4.0). For development docs, go here. F ...
- 《Entity Framework 6 Recipes》中文翻译系列 (44) ------ 第八章 POCO之POCO中使用值对象和对象变更通知
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-4 POCO中使用值对象(Complex Type--也叫复合类型)属性 问题 ...
- sublime text 3插件
Package Control Messages Emmet emmet插件 Thank you for installing Emmet -- a toolkit that can greatly ...
- AAS代码第2章
[root@node1 aas]# pwd /root/aas [root@node1 aas]# wget http://archive.apache.org/dist/spark/spark-1. ...
随机推荐
- 微服务架构理论&SpringCloud
一.什么是微服务? 微服务是一种程序架构模式,它提倡将单体应用程序划分成若干的小服务模块,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制 ...
- CentOS7安装Python3和VIM8
参考:http://blog.sina.com.cn/s/blog_45249ad30102yulz.html
- InstallSheild相关
一.关于使用InstallSheild制作安装包的总结. 1.定制化制作需要了解InstallScript语法,相关资料可以去网上查找,后续提供比较好的资料. 2.有些软件运行是需要一些环境的,譬如使 ...
- pure-ftpd管理FTP服务器,创建文件夹可以,但上传下载文件不行
两种原因 1.因为pure-ftpd的防火墙端口问题 # Port range for passive connections replies. - for firewalling. PassiveP ...
- hibernate不同条件查询结果集一样,主键@ID的原因
这一周在翻新公司的老项目,遇到了一些预想不到的事情. 其中一个是,使用hibernate查询,不同的查询条件,居然都查到同一条记录,感觉奇怪了,开始以为是session的原因: 后来发现是hibern ...
- 个人记录:对于python学习的反思和总结(一)
在写代码时,总是遇到写着写着不知道怎么写了的情况,或者无法把自己的想法用程序表达出来,所以有时候我们需要建立一个自己的编程思路,对一个具体程序的编程有一个比较清晰的想法:因此我把自己的思路总结了一下, ...
- 使用vue-cli+webpack搭建vue开发环境
在这里我真的很开心,好久没有用过博客,今天突然看到了我的博客有不少人看过,虽然没有留下脚印,但是还是激起了我重新拿起博客的信心,感谢大家. 在这里我们需要首先下载node,因为我们要用到npm包下载, ...
- c语言中“ld返回值1退回状态”
在c语言运行中我们经常会看到error:ld return 1 exit status的运行错误,其翻译为"ld返回值1退回状态".在生成程序时.有多个工具参与到步骤的运行中以创建 ...
- 【UE4 设计模式】原型模式 Prototype Pattern
概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...
- 第一次Scrum Metting
日期: 2021年4月23日 会议主要内容: 会议主要各自介绍一下所做任务,讨论了前后端接口定义以及服务器购买和接下来任务分配. 一.进度情况 组员 负责 两日已完成的工作 后两日计划完成的工作 工作 ...