結果

問題 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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()
0