【Codeforces】GoodBye 2019簡要題解

傳送門
七道構造題,外加一道暴力,妙啊! 話說構造題太考驗思維了,想不到就沒了。

A.Card Game

  • 直接貪心即可

B.Interesting Subarray

  • 可以發現當且僅當存在相鄰的兩個不滿足條件時才存在,也就是說任意一個不合法的子段一定有這麼一個相鄰的位置不合法。

C.Make Good

  • 因爲要求ai=2(a1xora2xor...ak)\sum a_i=2*(a_1 \:xor\:a_2\:xor...a_k),注意到有一個乘二,所以說最後一個位置相當於是已經確定了,然後倒着推過去就可以O(log)的時間用一個數完成要求的構造。
  • 或者還有一種構造方法。設剛開始的和爲s1,異或和爲s2。
  • 第一個數是s2,第二個爲(s1+s2)。然後發現這樣就可以了???神奇。

D. Strange Device

  • 簡單交互題 構造題。
  • 只需要將前k+1個選擇k次,那麼返回的只會有第m大的出現k+1-m次,第m+1大的出現k次,然後找到返回值中小的那個的個數就好了。

E. Divide Points

  • 剛開始一本正經地以爲是神仙的二分圖匹配的問題,結果還是構造???
  • 奇偶討論。因爲要討論(x1x2)2+(y1y2)2(x_1-x_2)^2+(y_1-y_2)^2的關係,所以直接按照x,y分別的奇偶性討論即可,一共有四種可能。
  • 注意到如果有不止一種可能,那麼就一定能分成兩組(如果x-y都同奇偶,有兩組,那麼它們最後的距離mod4是不一樣的)。
  • 否則全部座標除以二繼續做。可以預先全部變成正數。

F. Awesome Substrings

  • 首先計算一個前綴和記錄爲s[i],那麼相當於是求
    k>00<=l<r<=n[k(s[r]s[l])=(rl)]\sum_{k>0}\sum_{0<=l<r<=n} [\:k(s[r]-s[l])=(r-l)\:]
  • 注意到k如果很大的話那麼ks[m]<=nk*s[m]<=n,那麼有效的s[m]s[m]滿足s[m]<=nks[m]<=\frac{n}{k}
  • 那麼我們就可以平衡規劃了。
  • k<=Tk<=T時暴力O(Tn)O(Tn)k>=Tk>=T的部分枚舉左端點ll以及1的個數,計算右端點在這個區間內滿足k>=Tk>=T的個數,時間O(n2/T)O(n^2/T)
  • 可以用map完成暴力(雖然超級慢),然後要求上面兩個時間相等即可。

G. Subset with Zero Sum

  • 真·構造。首先化一下很醜的約束式子變成1<=ia[i]<=n1<=i-a[i]<=n
  • 超級優美——直接i向a[i]連邊,然後找環即可。

H. Number of Components

  • 基礎線段樹
  • 剛開始想建一個樹出來LCT,然後似乎有單調隊列???難搞
  • 然後發現一個性質,聯通快一定是連續的一段區間。否則左邊一塊隔着幾個和右邊一塊相連,你會發現中間的幾個一定會和左邊的或右邊的相連。
  • 既然如此,那麼問題就轉化爲了找分界點了。
  • 分界點xx一定滿足Mini<x(ai)>Maxi>=x(ai)Min_{i<x}(a_i)>Max_{i>=x}(a_i)
  • 現在我們想要維護分界點的個數。直接做並不好做。考慮轉換一下模型。
  • 對於上面的式子我們不妨找到Mini<x(ai)Min_{i<x}(a_i)ii,將aj>=aia_j>=a_ijj的位置賦爲1,aj<aia_j<a_i賦爲0.那麼最後對於這個ii,我們得到的序列是類似11…110…00這樣的。如果我們在這個序列前面加一個1,後面加一個0,那麼這個序列hh是這個形態當且僅當相鄰位置不同的個數爲1.
  • 我們對於每一個ii都維護一個hh的相鄰位置不同的個數ff,以a[i]a[i]爲關鍵字開一個權值線段樹,維護ff
  • 可以注意到修改一個位置pos只會跟pos-1或pos+1在h中與pos的0/1狀態有關,影響到的剛好是一個區間。分類討論即可。
  • 線段樹上只需要記錄最小的是什麼和最小的數的個數。
  • 由於修改自己不好改,所以不妨離線下來,全部一起操作。預處理也可以變成類似的操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章