é”ē®ēé£åŗ¦é”č²ä½æēØ Luogu äøēåē“ļ¼ē±ē°”å®å°å°é£åå„ēŗ š“š š”š¢šµš£ā«ć
rating: 1969
Problem Statement
é”ē®ē°”čæ°
éęÆäøåäŗåé”ć
Dilhan ęå
©ååå§ēŗ [2k] ēé£å a å bćä»åÆä»„ä»»ęꬔęøå·č”仄äøęä½ļ¼
- Flattenļ¼éøå®äøåé£åäøēę大å¶ęøå
ē“ xļ¼å°å
¶ęæęēŗå
©å x/2ć
- Concatenateļ¼å° a å b é½ę“ę°ēŗ a+bļ¼é£åäø²ę„ļ¼ć
ęēµ b 被äøę£ļ¼a 被é±čļ¼é·åŗ¦ēŗ nćä½ åÆä»„é²č”ęå¤ 300 欔詢åļ¼ęÆę¬”č©¢ååé [l,r] ēåć
ē®ęØęÆę±åŗé±čé£å a äøēę大å¼ć
Constraints
ē“ęę¢ä»¶
- n (1ā¤nā¤105)ć
- é±čé£åäøēå
ē“ 1ā¤aiāā¤230ć
- č©¢åꬔęøéå¶ļ¼300ć
ęč·Æļ¼äŗåęå°
ę øåæč§åÆ
- Flatten ęä½ļ¼å° x ęæęēŗ 2xā,2xāļ¼ēø½åäøč®ć
- Concatenate ęä½ļ¼å° a,b é½č®ēŗ a+bļ¼ēø½åēæ»åć
å ę¤ļ¼ęēµé£åēēø½åäøå®ęÆ 2kć
åå²é»ēę義
ęååÆä»„ééäŗåęå°ę¾å°åē¶“åēę¼ 2kā1 ēä½ē½® xćéååå²é»åÆč½ęå
©ēØ®å«ē¾©ļ¼
-
ä¾čŖ Concatenate ęä½ļ¼
- é£åęÆē± [1,x] å [x+1,n] å
©ååé£åę¼ę„čęć
- ē±ę¼č¼ēēåéä½æēØ Flatten ęä½ēꬔęøę“å°ļ¼å ēŗ Flatten åŖå¢å é·åŗ¦ćäøęøå°ļ¼ļ¼ę仄ę大å¼åæ
å®č½åØč¼ēēåéć
-
ä¾čŖ Flatten ęä½ļ¼
- éååéęÆē±ęåé£åē¶é Flatten ęä½åč£čęć
- å樣å°ļ¼č¼ēēåéä½æēØ Flatten ēꬔęøę“å°ļ¼ę大å¼ä¹č½åØč¼ēåéć
ē”č«ęÆåŖēØ®ę
ę³ļ¼ę大å¼äøå®ä½ę¼é·åŗ¦č¼ēēé£äøååéäøć
äŗåęå°ēē„
åŗę¼äøčæ°č§åÆļ¼ęååÆä»„ę”ēØä»„äøēē„ļ¼
- ę„č©¢ęå¾åäøč¼Ŗēēø½å 2Sļ¼å¾å°ē¶ååé [l,r] ēēø½å Sć
- å©ēØäŗåęå°ę¾å°åå²é» mļ¼ä½æå¾ [l,m] ēåēŗ 2Sāć
- ęÆč¼å·¦å³å
©éØåēé·åŗ¦ļ¼éøęč¼ēēåéē¹¼ēŗčēć
- ē¶åéé·åŗ¦ēŗ 1 ęļ¼ē¶åēēø½å S å³ēŗč©²å
ē“ ēå¼ļ¼ä¹ęÆę大å¼ć
ē¶éäøč¼Ŗäŗåå¾ļ¼ę大å¼ęåØēåéé·åŗ¦č³å°ēø®å°äøåćå ę¤ęå¤ē¶é O(logn) č¼Ŗäŗåļ¼å°±åÆä»„å°åéēø®å°č³ 1ć
č¤éåŗ¦åę
- ęéč¤éåŗ¦ļ¼O(log2n)
- ęÆč¼Ŗéč¦ O(logn) 欔詢åä¾äŗåę¾åå²é»ļ¼å
± O(logn) č¼Ŗļ¼ēø½čØ O(log2n)ā¤300ć
- 空éč¤éåŗ¦ļ¼O(1)
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| def query(l, r): print(f"? {l} {r}", flush=True) return int(input())
def answer(x): print(f"! {x}", flush=True)
def solve(): n = int(input())
l, r = 1, n s = query(1, n) while l < r: s //= 2 left, right = l, r - 1 while left <= right: mid = (left + right) // 2 if query(l, mid) < s: left = mid + 1 else: right = mid - 1 if (left - l + 1) <= (r - left): r = left else: l = left + 1 answer(s)
if __name__ == "__main__": t = int(input()) for _ in range(t): solve()
|
寫åØęå¾
äŗåé”ēę¬å°ęø¬č©¦ęå·§
å°ę¼éé”äŗåé”ļ¼ęååÆä»„åØę¬å°ę°åÆ«äøå Judge é”å„ä¾ęØ”ę¬č©ęø¬ē³»ēµ±ēč”ēŗćęååÆä»„ćå«ęćåę¬ēØę¼čč©ęø¬ę©éčØē query() å answer() å½ęøļ¼å°å®åéę°ęåę¬å° Judge ēå°ęę¹ę³ćé樣äøä¾ļ¼ęåēēØå¼ē¢¼åÆä»„åØåƦéęäŗ¤å°č©ęø¬ē³»ēµ±ä¹åļ¼å
åØę¬å°é²č”äøå®ē測試åé©čć
Code with Judge
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| from random import randint, choice from itertools import accumulate
DEBUG = False
class Judge: def __init__(self, n: int): self.n = n self.query_count = 0 self.max_queries = 300 self.array = self._generate_array(n) self.s = list(accumulate(self.array, initial=0)) def _generate_array(self, n: int): k = randint(1, 30) A, B = [1 << k], [1 << k]
def flatten(arr): max_val = max(arr) idx = choice([i for i, x in enumerate(arr) if x == max_val]) return arr[:idx] + [max_val // 2, max_val // 2] + arr[idx+1:]
while len(A) < n: ops = [] if max(A) > 1: ops.append('flatten_a') if max(B) > 1 and len(A) + len(B) + 1 <= n: ops.append('flatten_b') if len(A) + len(B) <= n: ops.append('concat') if not ops: k = randint(1, 30) A, B = [1 << k], [1 << k] continue op = choice(ops) if op == 'concat': new = A + B A = new[:] B = new[:] elif op == 'flatten_a': A = flatten(A) else: B = flatten(B) assert len(A) == n return A def query(self, l: int, r: int) -> int: assert 1 <= l <= r <= self.n self.query_count += 1 assert self.query_count <= self.max_queries return self.s[r] - self.s[l - 1] def answer(self, x: int): print(f"[DEBUG] Answer: ! {x}") print(f"[DEBUG] Total queries used: {self.query_count}") if x == (ans := max(self.array)): print("[RESULT] Correct!") else: print(f"[DEBUG] Generated array: {self.array}") raise ValueError(f"Wrong answer: {x}, Correct answer: {ans}")
def query(l, r): print(f"? {l} {r}", flush=True) return int(input())
def answer(x): print(f"! {x}", flush=True)
def solve(): n = int(input()) if not DEBUG else randint(1, 1500) if DEBUG: global query, answer judge = Judge(n) query = judge.query answer = judge.answer
l, r = 1, n s = query(1, n) while l < r: s //= 2 left, right = l, r - 1 while left <= right: mid = (left + right) // 2 if query(l, mid) < s: left = mid + 1 else: right = mid - 1 if (left - l + 1) <= (r - left): r = left else: l = left + 1 answer(s)
if __name__ == "__main__": t = int(input()) if not DEBUG else 10 for _ in range(t): solve()
|