結果
| 問題 |
No.801 エレベーター
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 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()
lam6er