ABC169 E - Count Median
問題原文
解法
【注意】雰囲気証明なので間違っている可能性が十分にあります!!!あくまでも「こうsubmitしたくなる気持ち」の1つとして読んでいただければ
考えうる最小の中央値は、全ての区間について を取った時。これを とする。
考えうる最大の中央値は、全ての区間について を取った時。これを とする。
ここから簡単のために が奇数の場合を考える。 ある数 が中央値になるにはどんな条件が必要かを考えてみる。すると以下がわかる。
2, 3 の条件から、
は中央値になり得ないことがわかる。
逆にそうでない場合、 「 を取れるような区間がある 」という条件さえ満たせば は中央値になりうることがわかる。
以下の数を取れるような区間が常に 個取れるような下限はどこだろう?と考えると、それは の中央値(= )であることに気づく。
以上の数を取れるような区間が常に 個取れるような上限はどこだろう?と考えると、それは の中央値(= )であることに気づく。
それぞれ、当然 を区間として含む。
ので、 内の中央値は全部作れそうな気持ちになる。
偶数の場合は0.5刻みになる。
実装
N = int(input()) A, B = [], [] for i in range(N): a, b = map(int, input().split()) A.append(a) B.append(b) A.sort() B.sort() if N % 2 == 1: M = B[N // 2] m = A[N // 2] print(M - m + 1) else: M = (B[N // 2 - 1] + B[N // 2]) / 2 m = (A[N // 2 - 1] + A[N // 2]) / 2 print(int((M - m + 0.5) * 2))
感想
中央値系は苦手。。。だけどメジアンメジアンを何度も解いていたのでギリギリ解けた。。。
証明難しい。多分間違ってるのでコメント待ってます。。。