結果
| 問題 |
No.3114 0→1
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-04-30 16:07:35 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,003 bytes |
| コンパイル時間 | 425 ms |
| コンパイル使用メモリ | 12,032 KB |
| 実行使用メモリ | 10,368 KB |
| 最終ジャッジ日時 | 2025-04-30 16:07:38 |
| 合計ジャッジ時間 | 2,752 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 3 |
| other | WA * 30 |
ソースコード
def min_operations_to_good_string(N, S):
a = [1 if c == '1' else -1 for c in S]
psum = [0] * (N + 1)
for i in range(N):
psum[i + 1] = psum[i] + a[i]
Z = [i + 1 for i, c in enumerate(S) if c == '0']
def can_make_good(K):
# 先頭からK個の0を1に変える
flip = [0] * (N + 2)
for idx in range(K):
flip[Z[idx]] += 1
# 累積和でA[i]を構築
cnt = 0
A = [0] * (N + 1)
for i in range(N + 1):
if i > 0:
cnt += flip[i]
A[i] = psum[i] + 2 * cnt
min_prefix = A[0]
for i in range(2, N + 1):
if A[i] < min_prefix:
return False
if A[i - 1] < min_prefix:
min_prefix = A[i - 1]
return True
left, right = 0, len(Z)
while left < right:
mid = (left + right) // 2
if can_make_good(mid):
right = mid
else:
left = mid + 1
return left