编程题
### 问题描述 小蓝最近研发了一种新的记账方式,并邀请了一些用户参加测试。交易账本可以看作是交易记录的集合,每条交易记录都有着一个独一无二的交易编号 $txId$ (编号大小反映了交易记录产生的时间顺序, $txId$ 小的交易记录先发生于 $txId$ 大的交易记录),每条交易记录包含一个或多个输入信息以及一个或多个输出信息。 其中输入来自于已经发生过的某比交易的某个输出,可以理解为这笔钱从某比交易输出后继续输入到了当前这比交易中,输入信息主要包含以下数据:$fromTxId$、$fromTxOutNumber$ ,这表示当前输入来自于交易编号为 $fromTxId$ 的第 $fromTxOutNumber$ $(fromTxOutNumber=0,1,2,\cdots )$ 个输出;输出信息主要包含以下数据:$account$、$val$ ,表示将 $val$ 数目的钱转移到了账户编号为 $account$ 的账户上。注意,当 $fromTxId$ 和 $fromTxOutNumber$ 都为 $-1$ 时,表明这是一笔特殊交易,由系统账户直接产生输出,特殊交易只含有一个输入和一个输出,可以认为系统账户拥有无限多数目的钱,特殊交易一定可以成功。 一个合法的账本应满足以下条件:1)对于每笔交易记录,所有的输入中涉及到的钱的总数目应和所有输出中钱的总数目相等;2)交易中的一个输出要么不使用,要使用的话输出中的钱应该全部分配给下一个输入,而不能分配给多个输入(特殊交易除外);3)交易按照顺序进行,不可以在某比交易中引用还未发生的交易。 现在已知一共有 $N$ 个不同的账户,初始时所有账户钱数目都为 $0$ ,账本上总计有 $M$ 条交易记录(按照交易完成的顺序进行记录),请你来判断下账本上的记录是否是合法的。 ### 输入描述 输入的第一行包含一个整数 $T$ ,表示有 $T$ 组输入数据。 对于每组输入数据: 第一行包含两个整数 $N,M$ ,用一个空格分隔,分别表示账户的数目和账本的交易记录数目,其中账户编号为 $0,1,2,\cdots,N-1$ ,交易记录编号为 $0,1,2,\cdots ,M-1$ 。 接下来 $M$ 行,每行包含一条交易记录的信息,交易记录编号依次为 $0, 1, 2, \cdots, M-1$ 。第一个整数 $inCount$ 表示输入的个数,接下来包含 $inCount$ 个输入信息,每个输入信息包含 $fromTxId$ 和 $fromTxOutNumber$ 两个整数;接下来包含一个整数 $outCount$ 表示输出的个数,然后接着包含 $outCount$ 个输出信息,每个输出信息包含 $account$ 和 $val$ 两个整数。 ### 输出描述 对于每组输入数据输出一行,如果账本记录合法则输出英文单词 $\verb|YES|$ ,否则输出英文单词 $\verb|NO|$。 ### 样例输入 ```text 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 ``` ### 样例输出 ```text YES NO NO NO ``` ### 样例说明 对于第一个数据:第一条交易 $(txId=0)$ 为特殊交易,给账户 $0$ 转入了 $100$;第二条交易 $(txId=1)$ 将上一条交易的唯一一个输出作为当前交易的输入,有两个输出,分别给账户 $1$ 和 $2$ 转入了 $50$ ;最后一条交易 $(txId=2)$ 将上一条交易的两个输出作为当前交易的输入,给账户 $2$ 转入了 $100$ 。 对于第二个数据,第三条交易中输入与输出总额不相等。 对于第三个数据,第一条交易中的输出被使用了超过一次。 对于第四个数据,第二条交易中引用了还未发生的交易的输出。 ### 评测用例规模 对于所有评测用例, $1\le T\le 10$ , $1\le N\le 100$ , $1\le M\le 1000$ , $1\le inCount, outCount\le 100$ , $1\le $交易中涉及到钱的数目$\le 10000$ , $0\le account\le N-1$ , $0\le fromTxId\le M-1$ 。
查看答案
赣ICP备20007335号-2