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. NMS的实现代码详解

    NMS代码说明(来自Fast-RCNN) 个人觉得NMS包含很多框,其坐标为(x1,y1,x2,y2),每个框对应了一个score,我们将按照score得分降序,并将第一个最高的score的框(我们叫 ...

  2. js中console.info的使用

    语法:console.info(obj1 [, obj2, ..., objN]);console.info(msg [, subst1, ..., substN]); 参数obj1 ... objN ...

  3. python 系统定时关机

    #coding=utf-8 "shutdown at 23:00" from datetime import * import os import win32api import ...

  4. VLC架构及流程分析

    0x00 前置信息 VLC是一个非常庞大的工程,我从它的架构及流程入手进行分析,涉及到一些很细的概念先搁置一边,日后详细分析. 0x01 源码结构(Android Java相关的暂未分析) # bui ...

  5. scrapy爬虫中间件-urlLength

    浏览器里面能输入的最大url是有限制的 safari 最多 一万多 ie最少  2083 urllength中间件源码 谷歌和火狐正常 八千多 """ Url Lengt ...

  6. 解决maven install报错:java.lang.NoClassDefFoundError: org/codehaus/plexus/compiler/util/scan/InclusionScanException

    问题:maven install时,报错:java.lang.NoClassDefFoundError: org/codehaus/plexus/compiler/util/scan/Inclusio ...

  7. centos安装zookeeper,并集群配置

    所有机器操作都一样! 注:zookeeper配置集群时 需把防火墙关掉 或者暴露配置文件里配置的端口, 并且在dataDir目录下要有myid文件 1 下载 wget https://mirrors. ...

  8. Python 爬虫js加密破解(四) 360云盘登录password加密

    登录链接:https://yunpan.360.cn/mindex/login 这是一个md5 加密算法,直接使用 md5加密即可实现 本文讲解的是如何抠出js,运行代码 第一部:抓包 如图 第二步: ...

  9. list去重,String[]去重,String[]去空,StringBuffer去重,并且以','隔开,list拆分

    1.// 删除ArrayList中重复元素 public static void removeDuplicate(List list) { HashSet h = new HashSet(list); ...

  10. Python学习进阶

    阅读目录 一.python基础 二.python高级 三.python网络 四.python算法与数据结构 一.python基础 人生苦短,我用Python(1) 工欲善其事,必先利其器(2) pyt ...