#P16528. [Dapc2024]investment investigation

[Dapc2024]investment investigation

题目背景

你经营着一家加密货币交易所,用户可以在这里交易 Budget Amplifying Profit Coin(BAPC)。随着交易所越来越受欢迎,监管机构要求你提交交易所成立以来的全部成交记录。

你没有直接保存成交记录,但幸运的是,所有买卖订单仍然完整保留。请根据订单到达顺序,恢复所有实际发生的交易。

题目描述

交易所维护当前尚未完成的买单和卖单。每个订单都有一个价格和一个数量。

普通订单

当一个普通订单到达时,将按照以下规则不断撮合:

  • 选择当前价格最低的卖单;
  • 选择当前价格最高的买单;
  • 若最低卖价不高于最高买价,则二者成交;
  • 每次成交尽可能多的数量,使得至少有一个订单被完全完成;
  • 如果多个同侧订单价格相同,则较早到达的订单优先;
  • 重复上述过程,直到最低卖价严格大于最高买价,或者某一侧没有未完成订单。

普通订单若没有被完全成交,其剩余部分会继续保留在订单簿中。

Fill-or-Kill 订单

对于一个 Fill-or-Kill(简称 fok)买单:

  • 当前必须存在足够多的、价格不高于该买单报价的未完成卖单,使该买单能够立刻全部成交;
  • 如果数量足够,则按照普通订单相同的优先级和撮合方式立即完成整个订单;
  • 如果数量不足,则整个订单直接取消,不发生任何交易,也不会进入订单簿。

fok 卖单的处理方式对称:当前必须存在足够多的、价格不低于其要价的未完成买单。

一个 fok 订单可以与多个已有订单成交,但必须在到达时立即全部完成。

给定所有订单,请按实际发生顺序输出全部交易。

输入格式

第一行包含一个整数 nn,表示订单数量。

接下来 nn 行,每行描述一个订单,格式为:

s t p a

其中:

  • ssbuysell,表示买单或卖单;
  • ttnormalfok,表示普通订单或 Fill-or-Kill 订单;
  • pp 为每个 BAPC 的报价或要价;
  • aa 为订单中的 BAPC 数量。

数据范围:

  • 1n1051\le n\le 10^5
  • 1p1091\le p\le 10^9
  • 1a1091\le a\le 10^9

输出格式

第一行输出实际发生的交易数量。

随后按照交易发生顺序,每行输出三个整数:

sell_index buy_index amount

分别表示:

  • 对应卖单在输入中的编号;
  • 对应买单在输入中的编号;
  • 本次交易的 BAPC 数量。

订单编号从 11 开始。

样例 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