結果
| 問題 |
No.1211 円環はお断り
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-16 00:20:08 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,675 bytes |
| コンパイル時間 | 166 ms |
| コンパイル使用メモリ | 82,356 KB |
| 実行使用メモリ | 265,880 KB |
| 最終ジャッジ日時 | 2025-04-16 00:23:00 |
| 合計ジャッジ時間 | 34,967 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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()
lam6er