trang chủ / đề bài / orderbook

Sổ lệnh

Đề bài

Mô tả

Xét một phiên bản đơn giản của sổ lệnh (order book) cho một loại cổ phiếu. Sổ lệnh là danh sách các lệnh của những người muốn mua hoặc bán một đơn vị cổ phiếu; mỗi lệnh được mô tả bởi một hướng (MUA hoặc BÁN) và một giá.

Tại mọi thời điểm, mọi lệnh BÁN đều có giá lớn hơn mọi lệnh MUA. Trong bài này, không có hai lệnh nào từng tồn tại có cùng giá.

Lệnh BÁN giá thấp nhất và lệnh MUA giá cao nhất được gọi là các lệnh tốt nhất.

Có hai thao tác có thể xảy ra với sổ lệnh:

  1. Ai đó thêm một lệnh mới với hướng và giá nào đó.
  2. Ai đó khớp lệnh MUA tốt nhất hoặc lệnh BÁN tốt nhất. Không thể khớp một lệnh không phải là lệnh tốt nhất (không ai chịu giao dịch ở mức giá tệ hơn). Sau khi được khớp, lệnh bị xoá khỏi sổ vĩnh viễn.

Chỉ được thêm lệnh MUA với giá nhỏ hơn giá của lệnh BÁN tốt nhất: nếu muốn mua với giá cao hơn thì thay vì thêm lệnh, người đó phải khớp lệnh BÁN tốt nhất. Tương tự, không được thêm lệnh BÁN với giá nhỏ hơn hoặc bằng giá của lệnh MUA tốt nhất. Chẳng hạn, không thể thêm lệnh "BÁN 20" khi trong sổ đã có lệnh "MUA 20" hoặc "MUA 25".

Bạn có trong tay một bản nhật ký sổ lệnh đã bị hỏng (ban đầu sổ không có lệnh nào). Mỗi thao tác trong nhật ký thuộc một trong hai dạng:

  1. ADD p: thêm một lệnh mới với giá p, hướng không rõ. Lệnh này không được mâu thuẫn với các lệnh vẫn còn trong sổ.
  2. ACCEPT p: khớp một lệnh tốt nhất đang có trong sổ với giá p, hướng không rõ.

Hướng của mọi thao tác đã bị mất. Thông tin trong nhật ký không phải lúc nào cũng đủ để xác định các hướng đó. Hãy đếm số cách khôi phục hướng cho tất cả các thao tác ADD sao cho mọi điều kiện nói trên đều được thoả mãn tại mọi thời điểm. Vì kết quả có thể rất lớn, hãy in ra phần dư của nó khi chia cho 109+7. Nếu không thể khôi phục hướng một cách hợp lệ, in ra 0.

Dữ liệu vào

  • Dòng đầu chứa một số nguyên n là số thao tác trong nhật ký.
  • Mỗi dòng trong n dòng tiếp theo chứa xâu ACCEPT hoặc ADD và một số nguyên p, mô tả loại thao tác và giá.

Dữ liệu ra

In ra số cách khôi phục hướng của các thao tác ADD theo modulo 109+7.

Ràng buộc

  • 1≤n≤363304
  • 1≤p≤308983066
  • Mọi thao tác ADD có giá đôi một khác nhau.
  • Với thao tác ACCEPT, đảm bảo lệnh có cùng giá đó đã được thêm vào và chưa bị khớp.

Ví dụ

Input Output Giải thích
6
ADD 1
ACCEPT 1
ADD 2
ACCEPT 2
ADD 3
ACCEPT 3
8 Mỗi lệnh được thêm vào một cuốn sổ đang rỗng rồi bị khớp ngay, nên nó có thể là MUA hoặc BÁN một cách độc lập: 23=8 cách.
4
ADD 1
ADD 2
ADD 3
ACCEPT 2
2 Khớp được lệnh giá 2 nghĩa là lệnh giá 1 phải là MUA và lệnh giá 3 phải là BÁN. Bản thân lệnh giá 2 có thể là MUA tốt nhất hoặc BÁN tốt nhất, cho 2 cách.
7
ADD 1
ADD 2
ADD 3
ADD 4
ADD 5
ACCEPT 3
ACCEPT 5
0 Sau ACCEPT 3, lệnh giá 4 buộc phải là BÁN và trở thành lệnh BÁN tốt nhất. Do đó không thể khớp lệnh giá 5, và nhật ký là không hợp lệ.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0