又是自閉的一天呢~

考前
早早進考場了。感覺桌子有億點點小,放鼠標的位置有點窄,不太習慣。
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
希望明年能進隊。