結果
| 問題 |
No.576 E869120 and Rings
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-31 17:49:22 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 1,791 bytes |
| コンパイル時間 | 199 ms |
| コンパイル使用メモリ | 82,448 KB |
| 実行使用メモリ | 282,448 KB |
| 最終ジャッジ日時 | 2025-03-31 17:50:21 |
| 合計ジャッジ時間 | 8,517 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 3 |
| other | MLE * 2 -- * 25 |
ソースコード
import sys
from collections import deque
def main():
N, K = map(int, sys.stdin.readline().split())
s = sys.stdin.readline().strip()
a = [int(c) for c in s]
def check(x):
b = [ai - x for ai in a]
prefix = [0.0] * (N + 1)
for i in range(N):
prefix[i+1] = prefix[i] + b[i]
# Case 1: Check non-circular segments of length >= K
min_prefix = prefix[0]
found = False
for i in range(1, N + 1):
if i >= K:
if (i - K) >= 0:
min_prefix = min(min_prefix, prefix[i - K])
if prefix[i] - min_prefix >= -1e-9:
found = True
break
if found:
return True
# Case 2a: Check if sum of entire array is non-negative
S = prefix[N]
if S >= -1e-9:
return True
# Case 2b: Check wrap-around segments
L = N - K
if L <= 0:
return False
min_sum = float('inf')
q = deque()
for i in range(1, N + 1):
j = i - 1
while q and prefix[j] >= prefix[q[-1]]:
q.pop()
q.append(j)
window_left = max(0, i - L)
while q and q[0] < window_left:
q.popleft()
if q:
current_sum = prefix[i] - prefix[q[0]]
if current_sum < min_sum:
min_sum = current_sum
return min_sum <= S + 1e-9
low, high = 0.0, 1.0
for _ in range(100):
mid = (low + high) / 2
if check(mid):
low = mid
else:
high = mid
print("{0:.15f}".format(low))
if __name__ == '__main__':
main()
lam6er