首页 > 其他分享 >CF1266D

CF1266D

时间:2023-09-07 19:55:17浏览次数:46  
标签:原题 连向 CF1266D 交易量 欠钱 我们 out

原题

翻译

其实这题的翻译反而不如原题好理解,建议先阅读原题后重新思考做法


 
 
 
 
 
 
 
 
 

\[\large{\color{#ff0000}{\text{分割线}}} \]

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


翻译把原来简单的东西复杂了

原题的题意是有若干个三元组\((x,y,z)\)表示\(x\)欠\(y\) \(z\)元钱

然后让你重新整理债务关系使得金钱交易量最小


我们发现我们把问题转换成欠钱和还钱的问题后,我们就可以思考一个东西了

我们平时欠钱还钱时,并不在乎是谁欠我们或是还给我们的,我们只在乎我们应该得到/失去多少钱

因此我们设\(in_u\)表示连向\(u\)点的边的边权和(即要收取\(in_u\)元),\(out_u\)表示从\(u\)连向别的点的边的边权和(即欠了别人\(out_u\)元,要换出去),则可以得到这个人的有效金钱交易量为\(in_u - out_u\)

我们得到这个后就很好考虑了,我们确定了每个人金钱交易量的下界,而且这个下界是始终可以取到的,一种构造方法就是始终让\(in_u - out_u\)为负的人给值为正的人钱,这种操作一定是不劣的

为什么呢?因为每个借给别人钱的人不管是分成多次,还是一次拿完,至少都会对交易量造成\(in_u - out_u\)的贡献。因此不存在更优的解法。

此外,这种方式一定是合法的。一个人借出去了\(in_u - out_u\)块钱,拿回来了\(in_u - out_u\)块钱,相当于债务清零。

最终复杂度\(O(n)\)

标签:原题,连向,CF1266D,交易量,欠钱,我们,out
From: https://www.cnblogs.com/fox-konata/p/17685927.html

相关文章