【省選模擬】20/06/03

Pro
Sol

  • 考場瘋狂 rushrush 兩份 5k5k 的代碼,死掉了。。。

  • AA:直接小常數 n3n^3 dpdp 可以拿 70
    考慮可反悔貪心,一個不是最優的策略是每次將這一位加 2,將下一位加 1
    考慮反悔,用最快的策略將當前位填滿,並且只需要考慮反悔 i1i-1 的決策
    對於 (i1,i)(i-1,i) 加上 (2,1)(2,1) 的情況,可以變成加 (1,2)+(1,2)(1,2)+(1,2) 即用 1 的代價將當前位加 3
    對於 i1i-1 加過一個 3 的情況,可以拆成 (1,2)+(2,1)(1,2)+(2,1) 將當前位加 3,或者拆成 (1,2)+(1,2)+(1,2)(1,2)+(1,2)+(1,2),用 2 的代價將當前位加 6,維護一下下一位可以用的 3 的個數貪心即可,CodeCode

  • BB:考慮先對距離進行討論,若 dadbdis(a,b)|da-db|\ge dis(a,b),那麼答案一定在 a,ba,b 另一側的子樹中,否則在鏈上某個點的子樹中,若這個點爲 lcalca,則需要 banban 掉兩棵子樹,並且考慮向上的情況,其餘的只需要 banban 掉一棵子樹或是不 banban,用長鏈剖分可以 O(1)O(1) 詢問
    考慮向上的情況,需要找到一個點 tt 滿足 d(depudept)mxdeptd-(dep_u-dep_t)\le mxdep_t,那麼我們從根開始維護一個到當前點 mxdeptdeptmxdep_t-dep_t 的最大值,在那個最大值的點進行查詢即可,瘋狂碼就行了 CodeCode

  • CC:考慮限制是 lcp(i,j)+lcs(i+m1,j+m1)m1lcp(i,j)+lcs(i+m-1,j+m-1)\ge m-1,我的做法是考慮建一個 SAMSAM 和一個 SASA,在 failfail 樹上枚舉一個 lcalca,考慮對其兒子 dsu on treedsu\ on\ tree,每個點有貢獻的是後綴數組上的一段區間,我們用線段樹合併維護這個區間就是一個區間加,這樣可以將輕兒子對其它兒子的貢獻算上,重兒子對輕兒子的貢獻是一個區間查詢,輕兒子對自己的貢獻需要容斥掉,瘋狂碼就行了CodeCode

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章