公式

A - 図書館の貸出管理 / Library Loan Management 解説 by admin 印刷ページ

Claude 4.6 Opus (Thinking)

Overview

This is a simulation problem where \(N\) libraries each have books of multiple genres, and you process \(Q\) lending requests in order to determine the final number of books and the number of failed requests.

Analysis

This problem does not require any special algorithm and can be solved by faithfully simulating exactly as described in the problem statement.

Key Observations

  • Each lending request is an operation that “decreases the number of books of the specified genre at the specified library by 1.”
  • However, when the number of books is \(0\), nothing happens, and instead the failure count is increased by \(1\).
  • Requests must be processed in chronological order, so rather than computing them all at once, they must be processed one by one in sequence.

Is a Naive Approach Sufficient?

Each of the \(Q\) requests can be processed in \(O(1)\). The operation for each request is simply “access a specific element of an array and subtract 1 depending on the condition,” so the total complexity is \(O(Q)\). Since \(Q \leq 2 \times 10^5\), this is fast enough.

Let’s verify with a concrete example. Suppose library 1 has 3 books of genre 1:

Request Books before processing Processing Books after processing Failed?
Library 1, Genre 1 3 \(3 > 0\), so lending succeeds 2 ×
Library 1, Genre 1 2 \(2 > 0\), so lending succeeds 1 ×
Library 1, Genre 1 1 \(1 > 0\), so lending succeeds 0 ×
Library 1, Genre 1 0 \(0 = 0\), so out of stock 0 ○

Algorithm

  1. Read input: Store the book data for \(N\) libraries in a two-dimensional array libraries.
  2. Process lending requests: Process the \(Q\) requests in order.
    • If the number of books of genre \(d_k\) at library \(v_k\) is greater than \(0\), decrease the number of books by \(1\).
    • Otherwise (the number of books is \(0\)), increase the failure count fail_count by \(1\).
  3. Output: Output the final number of books for each library, one line at a time, and finally output the number of failures.

Complexity

  • Time complexity: \(O\left(\sum_{i=1}^{N} M_i + Q\right)\)
    • \(O\left(\sum M_i\right)\) for reading the book data, \(O(Q)\) for processing the lending requests
  • Space complexity: \(O\left(\sum_{i=1}^{N} M_i\right)\)
    • For the array storing the book data

Implementation Notes

  • Conversion to 0-indexed: In the problem statement, library numbers and genre numbers start from \(1\), but Python arrays start from \(0\), so we convert using v -= 1 and d -= 1.

  • Fast input: Since \(Q\) can be up to \(2 \times 10^5\), we use sys.stdin.readline to speed up input. The standard input() can be slow in Python.

  • Batched output: Instead of calling print for each line individually, we accumulate lines in a list and output them all at once using sys.stdout.write at the end, reducing I/O overhead.

    Source Code

import sys
input = sys.stdin.readline

def main():
    N = int(input())
    libraries = []
    for i in range(N):
        line = list(map(int, input().split()))
        M_i = line[0]
        S = line[1:M_i+1]
        libraries.append(S)
    
    Q = int(input())
    fail_count = 0
    
    for _ in range(Q):
        v, d = map(int, input().split())
        v -= 1  # 0-indexed
        d -= 1  # 0-indexed
        if libraries[v][d] > 0:
            libraries[v][d] -= 1
        else:
            fail_count += 1
    
    out = []
    for i in range(N):
        out.append(' '.join(map(str, libraries[i])))
    out.append(str(fail_count))
    sys.stdout.write('\n'.join(out) + '\n')

main()

This editorial was generated by claude4.6opus-thinking.

投稿日時:
最終更新: