結果
問題 |
No.801 エレベーター
|
ユーザー |
![]() |
提出日時 | 2025-03-20 18:38:48 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 308 ms / 2,000 ms |
コード長 | 1,482 bytes |
コンパイル時間 | 168 ms |
コンパイル使用メモリ | 82,368 KB |
実行使用メモリ | 77,324 KB |
最終ジャッジ日時 | 2025-03-20 18:38:56 |
合計ジャッジ時間 | 6,661 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
MOD = 10**9 + 7 def main(): import sys input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]); idx += 1 M = int(data[idx]); idx += 1 K = int(data[idx]); idx += 1 elevators = [] for _ in range(M): L = int(data[idx]); idx += 1 R = int(data[idx]); idx += 1 elevators.append((L, R)) # DP state: dp_prev[x] is the number of ways to be at floor x after k moves dp_prev = [0] * (N + 2) # 1-based indexing, ignoring 0, N+1 is buffer dp_prev[1] = 1 for _ in range(K): # Compute prefix sum for dp_prev prefix = [0] * (N + 2) for x in range(1, N + 1): prefix[x] = (prefix[x-1] + dp_prev[x]) % MOD # Initialize difference array diff = [0] * (N + 2) for L, R in elevators: # Calculate sum S of dp_prev[x] for x in [L, R] S = (prefix[R] - prefix[L-1]) % MOD # Apply range [L, R] addition of S diff[L] = (diff[L] + S) % MOD if R + 1 <= N: diff[R+1] = (diff[R+1] - S) % MOD # Compute dp_next from the difference array current = 0 dp_next = [0] * (N + 2) for y in range(1, N + 1): current = (current + diff[y]) % MOD dp_next[y] = current % MOD # Update for next iteration dp_prev = dp_next print(dp_prev[N] % MOD) if __name__ == "__main__": main()