結果
問題 | No.1830 Balanced Majority |
ユーザー |
👑 ![]() |
提出日時 | 2022-02-04 22:28:32 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 59 ms / 2,000 ms |
コード長 | 1,805 bytes |
コンパイル時間 | 513 ms |
コンパイル使用メモリ | 81,976 KB |
実行使用メモリ | 69,472 KB |
平均クエリ数 | 8.31 |
最終ジャッジ日時 | 2024-06-11 12:05:31 |
合計ジャッジ時間 | 3,190 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 25 |
ソースコード
"""https://yukicoder.me/problems/no/1830前半と後半で分ける?まず、0項目をAとするラストがBの場合、最初と最後を除いた区間が答えラストもAの場合は真ん中で切る左右のうち、Bが多いほうを角から二分探索。A=Bとなる区間を見つける補集合が答え"""import sysfrom sys import stdinN = int(stdin.readline())askdic = {}askdic[N] = N//2def ask(i,side):if side == "L":if i in askdic:return askdic[i]print ("?",i,flush=True)cat = int(stdin.readline())askdic[i] = catreturn askdic[i]else:askind = N-iif askind in askdic:return N//2 - askdic[askind]print ("?",askind,flush=True)cat = int(stdin.readline())askdic[askind] = catreturn N//2 - askdic[askind]def getAB(rangenum,askans):if l1 == 1:return askans , rangenum - askanselse:return rangenum - askans, askans#N = int(stdin.readline())l1 = ask(1,"L")r1 = ask(1,"R")if l1 != r1:print ("!",2,N-1,flush=True)sys.exit()else:leftA,leftB = getAB(N//2, ask(N//2,"L") )#print (leftA,leftB)if leftA <= leftB:l = 1r = N//2while r-l != 1:m = (l+r)//2mA,mB = getAB(m , ask(m,"L") )if mA <= mB:r = melse:l = mprint ("!",r+1,N,flush=True)sys.exit()else:l = 1r = N//2while r-l != 1:m = (l+r)//2mA,mB = getAB(m , ask(m,"R") )if mA <= mB:r = melse:l = mprint ("!",1,N-r,flush=True)sys.exit()