A. Fair Playoff
模擬。
B. Array Reodering
貪心。
對於\(a_i\),統計\(1 \le j \le n, j \ne i\)且\(\gcd(a_i, 2a_j) > 1\)的個數,作為\(b_i\)。
\(b_i\)越大,越往前放。
C. Unstable String
對於偶數下表的字符,若其不為?
,則將其翻轉一下,即0
變為1
,1
變為0
。現在,若一個子串同時包含0
和1
,則該子串不合法。
現在可以用雙指針\(O(n)\)的到答案:不斷讓右端點加一,若加一后子串不合法,則不斷讓左端點加一,直至子串合法。
D. Playoff Tournament
觀察到比賽間是二叉樹的結構,且樹高為\(k\)。那么如果可以把樹建出來,就可以\(O(k)\)更新,\(O(1)\)查詢結果。
然后建樹就是借助隊列自底向上建,這個模擬一下就可以了。
每一個節點,也就是一場比賽,若結果已知,那么可能的勝者數量就已知,只是看是左兒子還是右兒子的勝者。否則其可能的勝者數量就是兩個子節點可能的勝者數量之和。
更新的話就是找到對應的節點,然后不斷向上跳到根,沿途更新答案。
E. Gold Transfer
操作1就模擬一下就好了。
操作2的話,因為要花費最小,所以相當於每次找到離根最近且還有剩余的節點,在那個節點買金子,重復直到沒有金子可買或者已經完成了購買任務。
注意到每次是優先買便宜的,所以如果一個節點一個節點買,購買的次數也不會太多。這個次數至多為\(O(n+q)\),因為每個節點至多被買空一次,每個操作2錢花完了也就停了。
現在只需要快速找到離根最近且還有剩余的節點,借助倍增(類似倍增求LCA)的思想可以\(O(\log n)\)的找到。
現在模擬一下就可以\(O(n \log n)\)解決了。