結果
| 問題 | No.507 ゲーム大会(チーム決め) | 
| コンテスト | |
| ユーザー |  codewow1 | 
| 提出日時 | 2019-12-27 23:51:03 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                RE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 2,929 bytes | 
| コンパイル時間 | 311 ms | 
| コンパイル使用メモリ | 82,428 KB | 
| 実行使用メモリ | 135,160 KB | 
| 最終ジャッジ日時 | 2024-10-09 17:20:12 | 
| 合計ジャッジ時間 | 5,439 ms | 
| ジャッジサーバーID (参考情報) | judge2 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | AC * 16 RE * 3 | 
ソースコード
import sys
# 入力を受け取る
input = sys.stdin.readline
N, M = map(int, input().split())
As = []
for i in range(N):
  As.append(int(input()))
K = As[0]
As = As[1:]
As.sort()
#### 二分探索 O(logN) ####
## ソート済み配列sorted_arrの中にTrueとFalseの境界が存在
## すべてTrue または すべてFalseもありうる
def binary_search(sorted_arr, type="max"):
  # 境目のうちTrue側のindexを返す。すべてTrueまたはFalseのときは-1を返す
  # 加えてindex=0の真偽値を返す
  # ref : 条件式に用いるための変数
  def binary_TF(sorted_arr, index):
    # 条件を設定する
    # 対象となる配列、基準となる配列要素(真ん中)、条件判定に使う基準
    K_pair = K + sorted_arr[index]
    As_after = As[0:index] + As[index+1:]
    Ps = []
    for i in range(M):
      pair_tmp = As_after[-1 - i] + As_after[-2*M + i]
      Ps.append(pair_tmp)
    if min(Ps) <= K_pair:
      return True
    else:
      return False
  # 配列の一番最初と最後の要素がそれぞれ条件を満たすかどうか
  TF_left = binary_TF(sorted_arr, 0)
  TF_right = binary_TF(sorted_arr, len(sorted_arr)-1)
  if TF_left == TF_right:
    # 両方が条件を満たす(または両方が条件を満たさない)場合は終了
    # 2番目の返り値に、両方の値(TrueかFalse)が入る
    if TF_left == True:
      if type == "max":
        return len(sorted_arr)-1, True
      elif type == "min":
        return 0, True
    else:
      return None, False
  else:
    if TF_right:
      # 最後の要素がTrueの場合、
      ok = len(sorted_arr)    # 末尾側をTrueにし、
      ng = -1                 # 先頭側をFalseにする
    else:
      # 最初の要素がTrueの場合、
      ok = -1                 # 先頭側をTrueにし、
      ng = len(sorted_arr)    # 末尾側をFalseにする
  while (abs(ok - ng) > 1):   # 境目が確定するまで繰り返す
    mid = int((ok + ng)/2)
    if binary_TF(sorted_arr, mid):
      ok = mid
    else:
      ng = mid
  # ok : 境目のうち、True側の配列インデックス
  # 2番目の引数は途中終了の場合との整合性をとるため。
  return ok, True
import pdb
# pdb.set_trace()
# K君を除いたスコアの最大値と最小値の範囲で二分探索する
ans = binary_search(As, type="min")[0]
if ans == None:
  print(-1)
else:
  print(As[ans])
# ある相方のスコアに対して、
# そのスコアを抜いた残りのスコア配列の中から
# 大きい順に2M個の数字を取り出す
# 取り出した2M個の数字群に対して、
# (1番大きい数字+1番小さい数字)+(2番目に大きい数字+2番目に小さい数字)+・・・
# を求めて、それぞれP1, P2, ... とする
# K君と相方のスコア合計値がPiの最小値よりも大きければOK
            
            
            
        