coci2011 debt 还债

Description

有N个人,每个人恰好欠另一个人Bi元钱,现在大家都没有钱,政府想要给其中一些人欠,使得大家都不欠别人钱。

如A欠B 50,B欠C 20,则当政府给A50元时,A会立刻用50还清和B的债务,B也会立刻用20还清和C的债务。

欠款必须一次还清。如A欠B 50, B欠A50,你不能给A 49元让A还49元给B。

问政府至少花多少钱?

Input Format

第一行 N (2≤N ≤ 200,000) 表示居民数

接下来N行, 每行有两个数 Ai和 Bi, 表示第i位居民欠编号为Ai的居民Bi元钱 1 ≤ Ai≤ N, Ai ≠ i ) , 1 ≤Bi ≤10,000

Output Format

政府至少花多少钱

Sample Input

4

2 100

1 100

4 70

3 70

Sample Output

170

Solution

若i欠Ai Bi元钱,则让i向Ai连出一条边权为Bi的边,构成几个联通块。

每个联通块,有且仅有一个环。(由题目所给的“每个人恰好欠另一个人Bi元钱”可得)。

对于不在环上的点a,用拓扑排序处理 ,若a不足以支付债务则由政府支付。

对于环上的点b,设环外的居民欠他\(S_1\)元,环上的居民欠他\(S_2\)元,他欠别人\(P\)元。

则政府需要为环上每个居民支付\(max(P-S_1 +S_2,0)​\)元钱,使得每个居民收到欠款之后有能力还债,并支付

所有环上居民中最小的\(max(P-S_1,0)\)使得有一个人能在未接受环上居民还钱的情况下能够还债。

Code

#include <cstdio>
#include <algorithm>
#define N 200007 inline int read(){
int num=0,k=1;char c=getchar();
while (c<'0'||c>'9'){if (c=='-')k=-1;c=getchar();}
while (c>='0'&&c<='9') num=(num<<1)+(num<<3)+c-48,c=getchar();
return num*k;
} bool pd[N];
int n,ans,s,m[N],d[N],To[2][N],stac[N]; inline void dfs(int k,int pre){
if (pre){
ans+=std::max(0,To[1][k]-pre-m[k]);
s=std::min(s,std::max(0,To[1][k]-m[k]));
}
pd[k]=true;
if (!pd[To[0][k]]) dfs(To[0][k],To[1][k]);
else {
pre=To[1][k],k=To[0][k];
ans+=std::max(0,To[1][k]-pre-m[k]);
s=std::min(s,std::max(0,To[1][k]-m[k]));
}
} int main(){
n=read();
for (int i=1;i<=n;++i)
To[0][i]=read(),To[1][i]=read(),++d[To[0][i]];
for (int i=1;i<=n;++i)
if (!d[i]) stac[++stac[0]]=i;
while (stac[0]){
int Top=stac[stac[0]--];
pd[Top]=true;
--d[To[0][Top]];
ans+=std::max(To[1][Top]-m[Top],0);
m[To[0][Top]]+=To[1][Top];
if (!d[To[0][Top]]) stac[++stac[0]]=To[0][Top];
}
for (int i=1;i<=n;++i)
if (!pd[i])
s=100007,dfs(i,0),ans+=s;
printf("%d\n",ans);
}

coci2011 debt 还债的更多相关文章

  1. 1642: 【USACO】Payback(还债)

    1642: [USACO]Payback(还债) 时间限制: 1 Sec 内存限制: 64 MB 提交: 190 解决: 95 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 &quo ...

  2. Emotion Debt 2017/1/6

    原文 We can't move beyond the past until our emotional debts are paid. Many people today live under th ...

  3. bzoj1021 [SHOI2008]Debt 循环的债务

    前天打了一场比赛,让我知道自己Dp有多弱了,伤心了一天,没刷bzoj. 昨天想了一天,虽然知道几何怎么搞,但我还是不敢写,让我知道自己几何有多弱了,伤心了一天,没刷bzoj 1021: [SHOI20 ...

  4. BZOJ 1021 [SHOI2008]Debt 循环的债务

    1021: [SHOI2008]Debt 循环的债务 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 694  Solved: 356[Submit][S ...

  5. BZOJ 1021: [SHOI2008]Debt 循环的债务( dp )

    dp(i, j, k)表示考虑了前i种钱币(从小到大), Alice的钱数为j, Bob的钱数为k, 最小次数. 脑补一下可以发现, 只有A->B.C, B->A.C, C->A.B ...

  6. Technical debt

    What is Technial debt? Technical debt is not bug. It is that the feature can work, but it is not a p ...

  7. [财务知识] debt debit credit 的区别于联系

    https://blog.csdn.net/sjpljr/article/details/70169303 剑桥词典解释分别为: Debt [C or U ] n.something, especia ...

  8. bzoj千题计划111:bzoj1021: [SHOI2008]Debt 循环的债务

    http://www.lydsy.com/JudgeOnline/problem.php?id=1021 如果A收到了B的1张10元,那么A绝对不会把这张10元再给C 因为这样不如B直接给C优 由此可 ...

  9. 【题解】Ples [COCI2011]

    [题解]Ples [COCI2011] 依旧是没有传送门,只有提供了数据的官网. [题目描述] \(N\) 个汉子和 \(N\) 个妹纸一起参加舞会,跳舞时只能是一个汉子一个妹纸配对,现在给出每个人的 ...

随机推荐

  1. MVC通过ViewBag动态生成Html输出到View

    今天再给自己总结一下,关于ViewBag赋值Html格式值,但是在web页显示不正常; 例如,ViewBag.Content = "<p>你好,我现在测试一个东西.</p& ...

  2. ASP.NET SignalR 系列(一)之SignalR介绍

    一.SignalR介绍 ASP.NET SignalR 是一个面向 ASP.NET 开发人员的库,可简化将实时 web 功能添加到应用程序的过程. 实时 web 功能是让服务器代码将内容推送到连接的客 ...

  3. aria2 添加任务后一直在等待,不进行下载是什么情况?

    https://www.v2ex.com/t/567014 跑 aria2 的机器配置比较低,是 j1900+4G 的小机器,系统是 ubuntu18.04 ,所有的任务都是 bt 下载.aria2 ...

  4. LocalDateTime&LocalDate&LocalTime

    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime ti ...

  5. hadoop细节 -> 持续更新

    Hdfs: hdfs写流程: 客户端通过DistributedFileSystem请求namenode上传文件 Namenode进行检查,比如父路径   文件本身,是否允许上传 Namenode相应信 ...

  6. JAVA9之后废弃newInstance()方法

    JAVA9之后废弃newInstance()方法 根据JAVA11的API 我们可以看见反射中的newInstance()方法不推荐使用了,用 clazz.getDeclaredConstructor ...

  7. 采用__call__ 实现装饰器模式

    装饰器模式在实现中也是很常见的:比如手机贴膜,手机壳 都是为了给手机增加一些额外功能 增加耐操 装饰器模式的本质就是对对象二次包装,赋额外功能 __call__ __call__是python魔术方法 ...

  8. React Native 开发豆瓣评分(七)首页组件开发

    首页内容拆分 看效果图,首页由热门影院.豆瓣热门.热门影视等列表组成,每个列表又由头加横向滑动的 电影海报列表构成. 所以可以先把页面的电影海报.评分.列表头做成组件,然后在使用 ScrollView ...

  9. intellij IDEA github clone 指定分支代码

    1.问题描述 在实际开发中,我们通常会使用idea克隆一个新项目(clone),通常情况下,我们默认克隆的是master分支,但是如果master分支只是一个空文件夹而已,真正的代码在develop分 ...

  10. 数据库开发-Django ORM的数据库迁移

    数据库开发-Django ORM的数据库迁移 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. Django 项目准备 1>.安装django包 pip install d ...