#P16528. [Dapc2024]investment investigation
[Dapc2024]investment investigation
题目背景
你经营着一家加密货币交易所,用户可以在这里交易 Budget Amplifying Profit Coin(BAPC)。随着交易所越来越受欢迎,监管机构要求你提交交易所成立以来的全部成交记录。
你没有直接保存成交记录,但幸运的是,所有买卖订单仍然完整保留。请根据订单到达顺序,恢复所有实际发生的交易。
题目描述
交易所维护当前尚未完成的买单和卖单。每个订单都有一个价格和一个数量。
普通订单
当一个普通订单到达时,将按照以下规则不断撮合:
- 选择当前价格最低的卖单;
- 选择当前价格最高的买单;
- 若最低卖价不高于最高买价,则二者成交;
- 每次成交尽可能多的数量,使得至少有一个订单被完全完成;
- 如果多个同侧订单价格相同,则较早到达的订单优先;
- 重复上述过程,直到最低卖价严格大于最高买价,或者某一侧没有未完成订单。
普通订单若没有被完全成交,其剩余部分会继续保留在订单簿中。
Fill-or-Kill 订单
对于一个 Fill-or-Kill(简称 fok)买单:
- 当前必须存在足够多的、价格不高于该买单报价的未完成卖单,使该买单能够立刻全部成交;
- 如果数量足够,则按照普通订单相同的优先级和撮合方式立即完成整个订单;
- 如果数量不足,则整个订单直接取消,不发生任何交易,也不会进入订单簿。
fok 卖单的处理方式对称:当前必须存在足够多的、价格不低于其要价的未完成买单。
一个 fok 订单可以与多个已有订单成交,但必须在到达时立即全部完成。
给定所有订单,请按实际发生顺序输出全部交易。
输入格式
第一行包含一个整数 ,表示订单数量。
接下来 行,每行描述一个订单,格式为:
s t p a
其中:
- 为
buy或sell,表示买单或卖单; - 为
normal或fok,表示普通订单或 Fill-or-Kill 订单; - 为每个 BAPC 的报价或要价;
- 为订单中的 BAPC 数量。
数据范围:
- ;
- ;
- 。
输出格式
第一行输出实际发生的交易数量。
随后按照交易发生顺序,每行输出三个整数:
sell_index buy_index amount
分别表示:
- 对应卖单在输入中的编号;
- 对应买单在输入中的编号;
- 本次交易的 BAPC 数量。
订单编号从 开始。
样例 1
输入
6
buy normal 700 10
sell normal 500 20
sell normal 800 58
buy fok 600 30
buy fok 900 60
sell normal 300 42
输出
3
2 1 10
2 5 10
3 5 50
样例 2
输入
3
buy normal 19 10
buy normal 19 20
sell fok 19 17
输出
2
3 1 10
3 2 7