CF Round 982(Div 2)

2K22發表於2024-11-07

遊記

還是VP
口胡了ABCD的做法,然後C假了
打程式碼其實挺難的

題解

A

反覆觀看樣例可知,如果兩個開關狀態不一樣燈泡開,否則燈泡關
如果要燈泡開著的儘可能少,那麼相同狀態的配對儘可能多
此時就是\(0\)\(0\)配對,\(1\)\(1\)配對,
如果有落單的\(0\)必定有落單的\(1\),最多湊\(1\)
沒有就是\(0\)
反之要燈泡開得多,那麼\(0\)\(1\)的配對儘可能多
此時答案就是min(cnt[0],cnt[1])
其中cnt[i]就是滿足\(a_j=i\)\(j\)的個數

B

如果從陣列中刪掉\(k\),那麼陣列就會變成兩半
這兩半中,左半邊不管怎麼分,各部分中位數必然小於\(k\)
因為最大數都小於\(k\)了中位數肯定小於最大數小於\(k\)
同理右半邊不管怎麼分,各部分中位數必然大於\(k\)
那如果各部分中位陣列成的陣列,這個中位數如果是\(k\)的話
其實只需要兩邊劃分出相同的段數即可
如果左右兩邊都是偶數個元素,那就各分成兩個奇數的段
此時\(k\)為奇數
否則兩邊都不用動,就一整段,此時\(k\)為偶數
唯一需要考慮的就是一半邊為空的情況
此時只有另一半邊也為空才行
也就是無解判斷:
\(k=1\)\(k=n\),且\(n\not=1\)時無解
如果\(n=1\)那就得特判出去,很簡單

C

對於能否構成三角形來說,
如果兩個小邊加起來大於最大的邊,那必然可以構成三角形
所以如果欽定\(a_i\)為最大值
首先大於\(a_i\)的要被賦成\(a_i\)
然後如果\(\exists j,k,a_j\leq \frac{a_i}{2},a_k\leq \frac{a_i}{2}\)
那麼顯然\(a_j+a_k\leq a_i\)就寄了
所以至多存在唯一的\(j,a_j\leq \frac{a_i}{2}\)
然後就是對\(a\)排個序先,
列舉每個\(a_i\),找到值域在\([\frac{a_i}{2},a_i]\)的最大下標區間
兩個下標lower_bound()/upper_bound()一下即可
不在這個區間範圍的都要改成\(a_i\)
取改的次數的最小值即可,這個顯然可以\(O(1)\)算出來
列舉\(a_i\)二分的複雜度\(O(n\log n)\)
排序時間複雜度\(O(n\log n)\)
總時間複雜度\(O(n\log n)\)
寫法在下取整和二分的時候挺麻煩的,有些細節要注意

D

首先,如果\(i\geq j\),必然有\(p_i\geq p_j\)
其次,這棵樹切開\(0\)以後必然是若干條鏈
這樣的話首先考慮同一層的節點\(i\)\(j\)
\(c_i\)為切掉\(0\)以後的鏈頂編號
如果\(c_i+1<c_j\),並且\(i,j\)同層
那麼中間空著的這麼幾條鏈必然不可能連上任何大於\(j\)的節點
否則\(k>j,p_k<p_j\)顯然會寄
也就是說,可用的鏈頂\(c_i\)這個集合的元素只出不進
那麼就直接找鏈頂有多少即可
顯然由於BFS序的關係,\(c_i\in [1,l-1],p_l=1\)
也就是說我們直接找到\(l\)即可求出\(c\)
然後對於每個\(i\),如果確定了\(i\)對應的鏈頂\(c_i\)
直接問\(c_i+1\)\(i+1\)的關係
如果\(c_i+1\not=c_{i+1}\)直接把\(c_i+1\)扔出去
如果找到了對應的\(c_i\)維護\(c_i\)這條鏈底下編號最大的元素更新即可
注意如果只剩下了\(l-1\)那就不用問了

相關文章