結果
問題 |
No.1211 円環はお断り
|
ユーザー |
![]() |
提出日時 | 2025-04-16 00:26:23 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,675 bytes |
コンパイル時間 | 983 ms |
コンパイル使用メモリ | 82,124 KB |
実行使用メモリ | 273,028 KB |
最終ジャッジ日時 | 2025-04-16 00:28:28 |
合計ジャッジ時間 | 34,134 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 2 |
other | AC * 30 TLE * 7 -- * 4 |
ソースコード
import sys import bisect def main(): N, K = map(int, sys.stdin.readline().split()) A = list(map(int, sys.stdin.readline().split())) sumA = sum(A) if K == 0: print(0) return if K == 1: print(sumA) return B = A + A S = [0] * (2 * N + 1) for i in range(2 * N): S[i+1] = S[i] + B[i] low = 1 high = sumA // K answer = 0 MAX_LOG = 20 while low <= high: mid = (low + high) // 2 next_pos = [0] * (2 * N) for i in range(2 * N): target = S[i] + mid j = bisect.bisect_left(S, target, i+1, min(2*N+1, i + N +1)) if j > 2 * N: j = 2 * N + 1 # unreachable next_pos[i] = j dp = [[0]*(2*N +2) for _ in range(MAX_LOG)] dp[0] = next_pos[:] + [2*N +1]*(2*N +2 - len(next_pos)) for k in range(1, MAX_LOG): for i in range(2*N): if dp[k-1][i] >= 2*N: dp[k][i] = 2*N +1 else: dp[k][i] = dp[k-1][dp[k-1][i]] ok = False for start in range(N): current = start cnt = 0 end = start + N for k in reversed(range(MAX_LOG)): if current >= end: break if dp[k][current] <= end: cnt += (1 << k) current = dp[k][current] if cnt >= K: ok = True break if ok: answer = mid low = mid + 1 else: high = mid -1 print(answer) if __name__ == "__main__": main()