提出 #22354907


ソースコード 拡げる

A = tuple(map(int, open(0).read().split()))[1:]

N = len(A)

def check(x):
  """
  (上側の) 中央値が x 以上なら True を返す。
  x 以上のものは +1、x 未満のものは -1 と数えて、区間和が 0 以上なら対象
  """
  N = len(A)
  count = [0] * (N + N + 10)
  count[0] = 1
  now = 0
  cumsum = 1
  k = 0
  for a in A:
    if a >= x:
      now += 1
      cumsum += count[now]
    else:
      cumsum -= count[now]
      now -= 1
    k += cumsum
    count[now] += 1
    cumsum += 1
  return k + k >= N * (N + 1) // 2

B = sorted(A)
# 中央値は B[i] 以上である
ok, ng = 0, N
while ok + 1 < ng:
  i = (ng + ok) // 2
  if check(B[i]):
    ok = i
  else:
    ng = i

print(B[ok])

提出情報

提出日時
問題 D - Median of Medians
ユーザ maspy
言語 Python (3.8.2)
得点 700
コード長 751 Byte
結果 AC
実行時間 391 ms
メモリ 20540 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 700 / 700
結果
AC × 3
AC × 19
セット名 テストケース
Sample 0_00.txt, 0_01.txt, 0_02.txt
All 0_00.txt, 0_01.txt, 0_02.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt
ケース名 結果 実行時間 メモリ
0_00.txt AC 21 ms 9024 KiB
0_01.txt AC 21 ms 9080 KiB
0_02.txt AC 18 ms 9076 KiB
1_00.txt AC 23 ms 9176 KiB
1_01.txt AC 20 ms 9076 KiB
1_02.txt AC 358 ms 11824 KiB
1_03.txt AC 367 ms 19908 KiB
1_04.txt AC 324 ms 20480 KiB
1_05.txt AC 346 ms 20388 KiB
1_06.txt AC 351 ms 20540 KiB
1_07.txt AC 361 ms 20364 KiB
1_08.txt AC 373 ms 19828 KiB
1_09.txt AC 365 ms 19900 KiB
1_10.txt AC 365 ms 19676 KiB
1_11.txt AC 357 ms 19912 KiB
1_12.txt AC 380 ms 19708 KiB
1_13.txt AC 386 ms 19800 KiB
1_14.txt AC 388 ms 19880 KiB
1_15.txt AC 391 ms 19776 KiB