[2020.6.20]ZJOI2020 Day1游記


又是自閉的一天呢~

考前

早早進考場了。感覺桌子有億點點小,放鼠標的位置有點窄,不太習慣。

8點50左右公布的密碼(驗題真的那么難么QwQ)

考時

T1

大致題意:

給出長度為\(n\)的,由\(a\)\(b\)組成的字符串。\(q\)次詢問,每次詢問一個區間,求區間中本質不同的,形如\(T=PP\)(由兩個相同的串拼成)的子串的數量。

\(40\%\)\(n\le5000\)

\(20\%\):滿足條件的子串(包括相同但是位置不同)不多於\(10^6\)

\(20\%\)\(q=1\)

\(100\%\)\(n,q\le2\times10^5\)

\(40\)分就直接哈希,即可\(O(1)\)判斷一個字串是否合法,離線詢問,倒序枚舉詢問左端點\(i\),記\(f_j\)表示左端點\(\ge i\),右端點恰好為\(j\)的合法子串數量。對於兩個相同但是位置不同的子串,取目前出現的,最晚的那一次。

\(i+1\)轉移到\(i\)只需要加入形如\([i,r]\)的合法字串,同時可以用哈希表維護每一個合法字串最后一次出現的位置。

那么詢問\([i,r]\)的答案即為\(\sum_{j=i}^rf_j\),前綴和即可。

時間復雜度\(O(n^2)\)

本來以為可以寫\(80\),仔細一想好像做不了\(q=1\),只有\(60\);結果算上\(40\)暴力總共寫了5k,結果還沒調完(大悲)

如果能直接找到所有滿足條件的字串,用與\(40\)pts相同的方法,用樹狀數組/線段樹維護前綴和就可以做額外的\(20\%\)

可以考慮后綴樹,對於樹上每一個節點\(x\),考慮兩個樹上LCA為\(x\)的后綴\(i,j(i<j)\),如果\(j-i\le len(x)\),那么子串\([i,j+(j-i-1)]\)就是合法的。

所以可以考慮線段樹合並,時間復雜度(應該是)\(O(m\log n+n\log^2n)\)

SAM寫掛調了很久,寫完還得和40暴力卡到一起。

然后結束前10min寫完,直接白給。好在還有40。

T2

大致題意:

給出一個長度為\(n\)的區間的廣義線段樹(每個節點的中點不一定是正中間),一個操作Modify(l,r)給區間打標記,非葉節點的標記可能會被pushdown掉。

一開始線段樹上所有節點沒有標記,現在進行\(k\)次操作,每次操作從\(\frac{n(n+1)}{2}\)個區間中等概率隨機,求最后有標記節點的數量期望。

\(n\le2\times10^5,k\le 10^9\)

想了30min毫無頭緒,寫了\(n\le10,k\le4\)\(k=1\)的點直接跑路。

拿到了20分的好成績

Upd:當時看到就覺得應該和19年D1T2一樣做,但是由於種種原因19年那題沒做QwQ,然后就白給了。事后去看了一眼19D1T2並發現思路完全相同。

T3

大致題意:

給出一個非負整數序列\(a_1,a_2,\dots a_n\),每次操作為區間減一,或者區間內奇數/偶數下標減一。求將序列變為全0的最少次數。

多組數據,\(T\le 10\)

\(30\%\)\(n,a_i\le 50\)

\(40\%\)\(n,a_i\le 200\)

\(70\%\)\(n\le 1000,a_i\le 10^9\)

\(100\%\)\(n\le 10^5,a_i\le10^9\)

本來以為能寫個\(40/70\)之類的,結果還是寫了\(30\)

可能這就是實力不足的選手吧。

可以考慮每個數有多少是被第一種操作刪去的(設為\(d_i\)),那么答案就是\(\sum max(0,d_i-d_{i-1})+max(0,(a_i-d_i)-(a_{i-2}-d_{i-2}))\)

所以直接一個三維dp,時間復雜度\(O(na^3)\)

總結

進考場腦子就空白。啥都想不到了

SAM一直學的不是特別好,今天可能是第一次完全自己手寫SAM。

於是中間花了一堆時間想SAM的細節,可能有一半左右的部分是自己現場糊的。

於是沒寫出來(悲)

不過確實很久沒寫過5k代碼了。。。

雖然這次白給了,但是對SAM的理解又加深了一步。

果然學算法還是要自己寫自己想。

明天還是盡己所能地寫暴力吧/kk

希望明年能進隊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM