luogu#P12209. [蓝桥杯 2023 国 Python B] 交易账本

[蓝桥杯 2023 国 Python B] 交易账本

题目描述

小蓝最近研发了一种新的记账方式,并邀请了一些用户参加测试。交易账本可以看作是交易记录的集合,每条交易记录都有着一个独一无二的交易编号 txIdtxId(编号大小反映了交易记录产生的时间顺序,txIdtxId 小的交易记录先发生于 txIdtxId 大的交易记录),每条交易记录包含一个或多个输入信息以及一个或多个输出信息。

其中输入来自于已经发生过的某笔交易的某个输出,可以理解为这笔钱从某笔交易输出后继续输入到了当前这笔交易中,输入信息主要包含以下数据: fromTxIdfromTxIdfromTxOutNumberfromTxOutNumber,这表示当前输入来自于交易编号为 fromTxIdfromTxId 的第 fromTxOutNumberfromTxOutNumberfromTxOutNumber=0,1,2,fromTxOutNumber=0,1,2, \cdots)个输出;输出信息主要包含以下数据:accountaccountvalval,表示将 valval 数目的钱转移到了账户编号为 accountaccount 的账户上。注意,当 fromTxIdfromTxIdfromTxOutNumberfromTxOutNumber 都为 1-1 时,表明这是一笔特殊交易,由系统账户直接产生输出,特殊交易只含有一个输入和一个输出,可以认为系统账户拥有无限多数目的钱,特殊交易一定可以成功。

一个合法的账本应满足以下条件:

  1. 对于每笔交易记录,所有的输入中涉及到的钱的总数目应和所有输出中钱的总数目相等;
  2. 交易中的一个输出要么不使用,要使用的话输出中的钱应该全部分配给下一个输入,而不能分配给多个输入(特殊交易除外);
  3. 交易按照顺序进行,不可以在某笔交易中引用还未发生的交易。

现在已知一共有 NN 个不同的账户,初始时所有账户钱数目都为 00,账本上总计有 MM 条交易记录(按照交易完成的顺序进行记录),请你来判断下账本上的记录是否是合法的。

输入格式

输入的第一行包含一个整数 TT,表示有 TT 组输入数据。

对于每组输入数据:

第一行包含两个整数 N,MN, M,用一个空格分隔,分别表示账户的数目和账本的交易记录数目,其中账户编号为 0,1,2,,N10,1,2, \cdots, N-1 ,交易记录编号为 0,1,2,,M10,1,2, \cdots, M-1

接下来 MM 行,每行包含一条交易记录的信息,交易记录编号依次为 0,1,2,,M10,1,2, \cdots, M-1。第一个整数 inCountinCount 表示输入的个数,接下来包含 inCountinCount 个输入信息,每个输入信息包含 fromTxIdfromTxIdfromTxOutNumberfromTxOutNumber 两个整数;接下来包含一个整数 outCountoutCount 表示输出的个数,然后接着包含 outCountoutCount 个输出信息,每个输出信息包含 accountaccountvalval 两个整数。

输出格式

对于每组输入数据输出一行,如果账本记录合法则输出英文单词 YES\tt{YES},否则输出英文单词 NO\tt{NO}

4
3 3
1 -1 -1 1 0 100
1 0 0 2 1 50 2 50
2 1 0 1 1 1 2 100
3 3
1 -1 -1 1 0 100
1 0 0 2 1 50 2 50
2 1 0 1 1 1 2 150
3 3
1 -1 -1 1 0 100
1 0 0 2 1 50 2 50
3 0 0 1 0 1 1 1 2 200
3 3
1 -1 -1 1 0 100
2 0 0 2 0 2 1 100 2 100
1 -1 -1 1 2 100
YES
NO
NO
NO

提示

样例说明

对于第一个数据:第一条交易 (txId=0)(txId=0) 为特殊交易,给账户 0 转入了 100;第二条交易 (txId=1)(txId=1) 将上一条交易的唯一一个输出作为当前交易的输入,有两个输出,分别给账户 1 和 2 转入了 50;最后一条交易 (txId=2)(txId=2) 将上一条交易的两个输出作为当前交易的输入,给账户 2 转入了 100 。

对于第二个数据,第三条交易中输入与输出总额不相等。

对于第三个数据,第一条交易中的输出被使用了超过一次。

对于第四个数据,第二条交易中引用了还未发生的交易的输出。

评测用例规模与约定

对于所有评测用例, 1T101 \leq T \leq 101N1001 \leq N \leq 1001M10001 \leq M \leq 10001inCount,outCount1001 \leq inCount, outCount \leq 10011 \leq 交易中涉及到钱的数目 10000\leq 100000accountN10 \leq account \leq N-1