提出 #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 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| 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 |