[ARC098F] Donation(找性质+点 Kruskal 重构树)

[ARC098F] Donation

给出一个 \(N\) 个点 \(M\) 条边的无向连通图,每个点的标号为 \(1\)\(n\), 且有两个权值 \(A_i,B_i\)。第 \(i\) 条边连接了点 \(u_i\)\(v_i\)

最开始时你拥有一定数量的钱,并且可以选择这张图上的任意一个点作为起始点,之后你从这个点开始沿着给定的边遍历这张图。每当你到达一个点 \(v\) 时,你必须拥有至少 \(A_v\) 元。而当你到达了这个点后,你可以选择向它捐献 \(B_v\) 元(当然也可以选择不捐献),当然,你需要保证在每次捐献之后自己剩余的钱\(\geq 0\)

你需要对所有的 \(n\) 个点都捐献一次,求你一开始至少需要携带多少钱。

\(1\le N\le 10^5,N-1\le M\le 10^5,1\le A_i,B_i\le 10^9,1\le u_i<v_i\le N\),保证题目给出的图联通。

考虑倒着来,那么每个点的限制变成了需要至少 \(C_i=\max\{A_i-B_i,0\}\) 钱才能到达,到了之后能够得到 \(B_i\) 块钱。

\(\bigstar\texttt{Hint}\):后面没有想到的主要原因是,没发现如果到达了一个 \(C_i\) 的点,则所有 \(\le C_i\) 的点都可以随意经过。

这样想到用 \(\text{Kruskal}\) 重构树建立连通性,越往上 \(C\) 越大,在树上判断。

答案一定是由一个节点向根节点方向走,到达 \(u\) 后将 \(u\) 的所有子树遍历后在向上走。

\(dp_{i}\) 表示从 \(i\) 子树中一点走到 \(i\) 所需要的最小初始钱数,\(S_i\) 表示 \(i\) 为根的子树的 \(B\) 之和,则根据儿子们如下转移:

  • 如果自己是叶子节点,则 \(dp_{i}=C_i\)
  • 如果不是,则 \(dp_{i}=\min_v\{\max(dp_i,C_i-S_v)\}\)
#define Maxn 100005
int n,m,tot,rt;
int bel[Maxn],A[Maxn],B[Maxn],C[Maxn],fa[Maxn];
int hea[Maxn],nex[Maxn<<1],ver[Maxn<<1];
ll dp[Maxn],sum[Maxn];
vector<int> g[Maxn];
struct Point
{int num,a,b,c;Point(int _num=0,int _a=0,int _b=0,int _c=0):num(_num),a(_a),b(_b),c(_c){}bool friend operator < (Point x,Point y){ return (x.c!=y.c)?x.c<y.c:x.num<y.num; }
}d[Maxn];
int Find(int x){ return (fa[x]==x)?x:(fa[x]=Find(fa[x])); }
inline void add(int x,int y){ ver[++tot]=y,nex[tot]=hea[x],hea[x]=tot; }
void dfs(int x)
{if(!g[x].size()) { sum[x]=B[x],dp[x]=C[x]; return; }sum[x]=B[x],dp[x]=infll;for(int v:g[x])dfs(v),sum[x]+=sum[v],dp[x]=min(dp[x],max(dp[v],C[x]-sum[v]));
}
int main()
{n=rd(),m=rd();for(int i=1;i<=n;i++)A[i]=rd(),B[i]=rd(),C[i]=max(A[i]-B[i],0),d[i]=Point(i,A[i],B[i],C[i]),fa[i]=i;for(int i=1,x,y;i<=m;i++) x=rd(),y=rd(),add(x,y),add(y,x);sort(d+1,d+n+1);for(int p=1,x,y;p<=n;p++){x=d[p].num;for(int i=hea[x];i;i=nex[i]){y=Find(ver[i]);if(x!=y && (C[y]<C[x] || (C[y]==C[x] && y<x)))g[x].pb(y),fa[y]=x;}}rt=d[n].num,dfs(rt);printf("%lld\n",dp[rt]+sum[rt]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.Net Core分布式部署中的DataProtection密钥安全性

在.NetCore中默认使用DataProtection来保护数据&#xff0c;例如Cooike等。一般情况下DataProtection生成的密钥会被加密后存储&#xff0c;例如默认的文件存储可以看到使用了Windows DPAPI加密。但是如果更改默认设置例如使用的外部存储如redis则此时密钥默认是不加密的微软说…

P2294 [HNOI2005]狡猾的商人

P2294 [HNOI2005]狡猾的商人 题意&#xff1a; 你需要调查某个商人的账本&#xff0c;给你n个月内&#xff0c;m条账单信息&#xff0c;每条账单信息为x到y月的收入或者支出多少钱&#xff0c;问你根据账单信息判断这个账本是否合理 5 3 1 5 100 3 5 50 1 2 51比如样例&…

洛谷P1852:跳跳棋(LCA,树形结构)

解析 考虑一个三元组(x,y,z)(x,y,z)(x,y,z)&#xff0c;看它能如何跳 要么是yyy往左右跳&#xff0c;左右边界会变大 要么是两边往中间跳&#xff0c;由于最多跨过一个棋子&#xff0c;所以左右边界会变小 当三点等距时&#xff0c;无法往中间跳 于是我们惊喜的发现&#xff1…

scanf(“%s“)真的只开读入字符串大小就可以了吗??

文章目录前言还原过程计算机程序背后的故事总结瞎逼逼前言 艹艹艹艹艹艹&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;老子没想到没想到&#xff0c;靠&#xff01; 本人刚刚在做树链剖分“染色”一题的代码重构&#xff0c;上午打…

P5299-[PKUWC2018]Slay the Spire【dp】

前言 正题 题目链接:https://www.luogu.com.cn/problem/P5299 题目大意 有2n2n2n张牌&#xff0c; nnn张强化牌&#xff0c;每张上有一个正整数x(x>1)x(x>1)x(x>1)&#xff0c;如果使用后之后的每一张攻击牌伤害都会乘上xxx。nnn张攻击牌&#xff0c;每张上有一个正…

CF1152F Neko Rules the Catniverse(状压 DP)

CF1152F Neko Rules the Catniverse 给定参数 \(n,k,m\)&#xff0c;你需要求有多少个大小为 \(k\) 的序列 \(a\) 满足如下三个条件&#xff1a; 任意两个元素其权值不同。对于任意 \(i\) 满足 \(1\le i\le k\) 有 \(1\le a_i\le n\)。对于任意 \(i\) 满足 \(2\le i\le k\) 有 …

asp.net core2.2 多用户验证和授权

asp.net core2.2 用户验证 和授权有很详细和特贴心的介绍&#xff0c;我感兴趣的主要是这两篇&#xff1a;cookie身份验证基于角色的授权我的项目有两类用户&#xff1a;微信公众号用户&#xff0c;用户名为公众号的openid企业微信的用户&#xff0c;用户名为企业微信的userid每…

P1494 [国家集训队]小Z的袜子

P1494 [国家集训队]小Z的袜子 题意&#xff1a; 有一个长度为 n 的序列c[i] 。现在给出 m个询问&#xff0c;每次给出两个数l,r &#xff0c;从编号在 l 到 r 之间的数中随机选出两个不同的数&#xff0c;求两个数相等的概率。 题解&#xff1a; 很明显&#xff0c;莫队算法…

CSP2020洛谷P7076:动物园(位运算)

你知道它很水&#xff0c;但你就是切不掉它 解析 一直卡85&#xff01;&#xff01; 原因&#xff1a;最后判断的循环应该从0到k-1而不是从1到k&#xff01; 啊啊啊一定要小心啊qwq 说实话这个分都算是好的&#xff0c;这种bug爆大分一点招没有 还有一个问题是对于ans64爆unsi…

一文带你快速读懂.NET CLI

dotnet cli 是 .Net Core 功能中最有用的特性之一。在这篇文章里&#xff0c;我们将介绍几个.Net OSS 工具是如何使用 dotnet cli&#xff0c;并介绍如何在日常开发中使用新的 cli 工具。正文关键要点dotnet cli 使得基于. Net 项目的自动化和脚本编写变得非常简单&#xff0c;…

[POJ 3164]Command Network(最小树形图,朱刘算法)

文章目录titlesolutioncodetitle solution 读完翻译后&#xff0c;很明显就是个朱刘算法的板子题 最小树形图&#xff0c;就是给出一个带权有向图 从中指定一个特殊的结点 root 求一棵以 root 为根的有向生成树 T&#xff0c;且使得 T 中所有边权值最小 简单来说&#xff0c…

CF1553H-XOR and Distance【dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF1553H 题目大意 给出nnn个在[0,2n)[0,2^n)[0,2n)范围内的数字序列aaa。 对于每个x∈[0,2n)x\in[0,2^n)x∈[0,2n)求 min⁡i≠j∣aixorx−ajxorx∣\min_{i\neq j}\ |a_i\ xor\ x-a_j\ xor\ x|i​jmin​ ∣ai​ xor x−aj​…

同余最短路

主要内容 形如&#xff1a; 设问 \(1\) &#xff1a;给定 \(n\) 个整数&#xff0c;求这 \(n\) 个整数在 \(h(h\le2^{63}-1)\) 范围内 能拼凑出多少的其他整数( 个整数可以重复取) 。 设问 \(2\) &#xff1a;给定 \(n\) 个整数&#xff0c;求这 \(n\) 个整数 不能拼凑出的最小…

SP10707 COT2 - Count on a tree II

SP10707 COT2 - Count on a tree II 题意&#xff1a; 给定 n 个结点的树&#xff0c;每个结点有一种颜色。 m 次询问&#xff0c;每次询问给出 u,v&#xff0c;回答 u,v 之间的路径上的结点的不同颜色数。 1< n < 4*10^4 1< m < 10^5 题解&#xff1a; 树上…

[CQOI2018]异或序列

[CQOI2018]异或序列 题意&#xff1a; 给定1个整数K&#xff0c;离线询问[l,r]中有多少子区间xor和K。 题解&#xff1a; 异或有个重要的性质&#xff1a;它的逆运算就是自身 我们维护该数列的前缀异或和a[x],表示1到x的区间异或和&#xff0c;这样问题就变成了在区间[l-1,…

ASP.NET Core 3.0:将会拥有更少的依赖

在ASP.NET Core项目中&#xff0c;我们使用一个叫做Microsoft.AspNetCore.App的综合包。它也被称为ASP.NET Core Shared Framework&#xff0c;在ASP.NET Core Shared Framework之中包含了很多依赖项&#xff0c;它能满足一般应用的需求。但是如果你查看它的依赖项&#xff0c;…

CSP2020洛谷P7077:函数调用

解析 没做出来… qwq 自己只能想到拓扑开vector把每个函数搞成一个奇怪的加法标记和乘法标记的结合 极限数据卡一卡还是nm的 得分纯玄学qwq 本题的关键是乘法相当于把函数调用多次 这样就可以利用和全是加法类似的策略拓扑统计每个函数的调用次数 使问题得以解决 要注意部分…

CF1616H Keep XOR Low(Trie 树上 DP)

CF1616H Keep XOR Low 给你 \(n\) 个整数 \(a_1,a_2,\cdots,a_n\) 和一个整数 \(x\)。 你需要求出 \(\{1,2,\cdots,n\}\) 的一个子集 \(S\)&#xff0c;满足 \(S\) 中任意两个不同的元素 \(i,j\)&#xff0c;满足 \(a_i~{\rm xor}~a_j\le x\)。 求选取 \(S\) 的方案数&#xff…

[UVA - 11865]Stream My Contest(最小树形图+朱刘算法)

本题过于简单&#xff0c;朱刘算法模板题&#xff0c;考虑二分一下带宽即可titlecodetitle code #include <cstdio> #include <cstring> #include <iostream> using namespace std; #define MAXN 65 #define MAXM 100005 #define int long long #define in…

CSP2021NOIP2021游记

CSP Day -? 初赛 初赛考前没怎么复习&#xff0c;反倒是理直气壮的翘了一周晚修&#xff08;虽然后面就一直翘了&#xff09;。 开考之后才发现要拿那几张纸&#xff0c;监考让我考完再出去拿。 选择题很简单&#xff0c;没有啥犹豫的写完了&#xff0c;第一道读程序写结果好…