上午感覺不錯,下午改不出題,晚上破防。
簡略思路:
T1
本質應該是 DP 維護一次函式。
不會正解。晚上看了好久、好多篇題解還是不會。有點靜不下心來看比較長的題解。
放點別人的題解,有空再來研究:
https://www.cnblogs.com/flywatre/p/17236732.html
https://blog.51cto.com/u_15300835/3064939
https://www.cnblogs.com/C202044zxy/p/15082636.html
https://www.luogu.com.cn/article/u2zqliav
T2
\(2 \times n\) 很特殊,發現結論,即一直往右走,撞到障礙就往上下走,然後接著往右走,這樣貪心應該是對的。
然後有各種做法:
-
yzj 學長的線性做法:考慮把障礙分段。首位兩段可能不連續,預處理後直接走。中間段時連續的,直接統計。好像有些特判。
-
另一位學長的倍增做法(好像還有一位學長也用的倍增):按步數倍增。最後要看是不是在同一行,答案可能要加 1。我不清楚細節怎麼寫,另有 jsh 所言要特判三種情況:u、v 重合;u、v 在同一列;u、v 不連通(是不是這三種我忘了,這三種是我憑回憶和自己的想法寫的,可能不對,可能不是 jsh 所說的)(實際上她說的是不是三種我都不太確定,應該是吧)(在某些方面記憶力不好加上一天接觸的資訊不少是這樣的 \kel)。
-
題解的線段樹做法:都是用 DS 來維護,考慮維護的段的四個端點間的最短路([四條,同一列的之間不維護](?))。另一位學長有一個比較像的分塊做法,聽說它們本質是相同的。
然後我還一種都沒寫。
T3
揹包:
- DP。
- 生成函式。(我當時想的是拉格朗日插值,然後發現好像不行,因為最後的[“多項式”](??)次數太高了)
- 暴力狀壓列舉。
\(n=20\) 直接狀壓列舉,\(n=40\) 就想到折半狀壓。
先想的是動態開點線段樹。然後要寫的時候發現直接陣列存,upper_bound 二分即可。
T4
看到出現次數什麼的想到 xor hashing。
題解的思路:
每種顏色都出現奇數次不好處理。考慮轉換成每種都出現偶數次,這樣 xor 起來為 0 就滿足限制了。轉換的方式是把每種顏色都刪掉一次在詢問區間中的出現。
怎麼刪?把每個顏色區間(輸入給的區間)的左端點都不考慮,相當於把左端點右移一位;然後再把每個詢問區間(我們想判斷它是否符合限制的區間)的左端點右移一位。發現這樣應該是可行的。感覺這是個很妙的轉化。
然後算字首 xor 和,用個 unordered_map 來輔助統計。[unordered_map 應該不會被卡,因為 hash 值是隨機的。](??)
另外要注意減去一種顏色也沒有的情況的貢獻。這是特殊的。
我的思路:
對於一個詢問區間,統計兩個東西:
- 其中每 種 顏色的 hash 值的 xor 和。
- 其中每 個 顏色所屬種類的 hash 值的 xor 和。(這樣描述不太清楚,其實就是 1 是每種顏色只統計一次,2 是每種顏色出現了多少次就統計多少次)
當這兩個東西相等的時候這個區間就可行(此時先不管什麼顏色都沒有的區間,即先認為這種區間也是可行的)。那麼這兩個東西 xor 起來等於 \(0\) 就說明這個區間可行。
於是用[掃描線](???)。列舉詢問區間右端點,查可行區間的長度之和。用 01-Trie 維護。
但是相比正解(指題解做法)不太好寫。我今天考場上寫掛了。
2024.8.21