【雜文】隨心一記
一:【可能會用到的小知識】
-
數據較小 \((n \leqslant 20)\) 的題通常有三種做法:搜索,狀壓,高維大狀態 \(dp\) 。
-
在對一個矩陣進行重復的覆蓋操作時可用冰茶姬優化枚舉【例 \(1\)】 【例 \(2\)】。(后來在一次考試中,\(T3\) 因時間不足只能打 \(25pt\) 的 \(kn^3\) 暴力,當時突發奇想,用類似的思路優化了樹上向根節點的跳躍,變為 \(kn^2\) 拿了 \(35pt\))
-
求最大值最小可用二分,第 \(K\) 大最小亦可。
-
判斷樹上兩條路徑 \((a,b),(c,d)\) 是否相交:必定有其中一條路徑的兩個端點的 \(LCA\) 在另一條路徑上。設
lca1=LCA(a,b),lca2=LCA(c,d)
且deep[lca1]>=deep[lca2]
,當滿足(LCA(lca1,c)=lca1||LCA(lca1,d)=lca1)
時成立。 【例 \(1\)】 【例 \(2\)】 -
一顆無根樹上任意一條路徑必定可以在以某個葉節點為根時,變成一條從上到下的路徑(利於廣義 \(SAM\) 的使用)。【例 \(1\)】
-
莫隊離線處理序列上的區間詢問時,如果所有區間互不包含或互不重疊,指針轉移的復雜度可降為 \(O(n)\) 。【例 \(1\)】
-
已知一條直線 \(Ax+By+C=0\),對於直線上方的點 \((x_0,y_0)\),\(Ax_0+B_0y+C\) 的正負性均與 \(A * B\) 相同 【例 \(1\)】 。
-
概率順推,期望逆推。
-
\(or\) 運算的 \(\text{FWT}\) 求點值相當於是在做子集求和,即計算 \(f(S)=\sum_{T\subseteq S}g(T)\)。也可以用 \(\text{FMT}\) 簡單實現。兩者復雜度均為 \(O(n\log n)\),而暴力枚舉子集復雜度為 \(O(3^n)\)。【例 \(1\)】
-
看見方格矩陣先黑白染色冷靜一下。
-
\(T(n)=T(\frac{n}{2})+O(n\log n)\Longrightarrow T(n)=O(n\log n)\) 。
二:【算法細節、坑點】
-
寫珂朵莉時注意:枚舉
itl=split(l)
到itr=split(r+1)
如果用了 \(while()\),在一大堆操作后面要加一句++itl;
(\(\text{inf}\) 次)。 -
寫 \(\text{kosaraju}\) 時注意:儲存詢問給出的邊時,空間要開成 \(M\) 而不是 \(N\)(\(3\) 次)。
-
寫 \(\text{tarjan}\) 時注意:若用 \(ip[x]\) 表示 \(x\) 所在強聯通分量編號,計算縮點后圖中點的度數時應取 \((ip[x],ip[y])\) 而不是 \((x,y)\)(\(4\) 次)。
-
寫線段樹時注意:乘法標記要初始化為 \(1\)。標記可為 \(0\) 時初始化為 \(-1\)(\(1\) 次) 。
-
寫差分約束時注意:超源要把邊連出去,一顆內向菊花圖是跑不出結果的(\(1\) 次)。
-
寫 \(\text{Dinic}\) 時注意:\(bfs\) 分層前 \(dis[st]\) 要初始化為 \(1\) 而不是 \(0\),如果沒有使用 \(vis\) 數組的話就會出問題(\(1\) 次)。
-
寫主席樹時注意:\(change\) 函數里面新開節點應寫
p=++o;tr[p]=tr[q];
而不是if(!p)p=++o;tr[p]=tr[q];
否則信息會被覆蓋掉 【例】 (\(1\) 次)。 -
寫無返回值的函數時注意:用 \(void\) 啊!一定不要定義成 \(int,long\ long\) 或者 \(double\),例如用取地址符的快讀,手寫 \(swap\) 等等,其危害巨大且不易察覺(\(3\) 次)。
-
寫莫隊時注意:塊的大小應該為 \(\sqrt{n}\) 而不是 \(\sqrt{T}\)(\(3\) 次)。
-
寫莫隊時注意:答案數組要開到 \(T\) 而不是 \(N\)(\(4\) 次)。
-
寫 \(\text{Trie}\) 樹 時注意:如果第一個節點為 \(1\),那么 \(cnt\) 應初始化為 \(1\)(\(2\) 次)。
-
寫 帶修莫隊 時注意:僅當修改下標在 \([nowL,nowR]\) 以內時才執行 \(add(),del()\),但 \(swap\) 無論如何都必須要執行(\(1\) 次)。
-
寫 \(\text{Manacher}\) 時注意:以 \(i\) 為中點半徑為 \(r\) 的回文串實際長度為
r-!(i+r&1)
(如果 \(i\) 與 \(r\) 奇偶性相同則長度為 \(r-1\) 否則為 \(r\))。如果 \(r\) 為 \(i\) 的最大半徑,那么 \(i\) 與 \(r\) 奇偶性一定相同,所以通常是直接算作 \(r-1\),但有時候【例】也會用非最大半徑進行計算,此時則不能直接用 \(r-1\)(\(1\) 次)。 -
寫樹上線段樹合並時注意:通常我們是合並了一顆子樹里的所有信息后直接查詢節點,並且此后不會再次查詢這個點,所以 \(merge(p,q)\) 時可以將合並后的信息放到 \(p\) 里面返回。但如果要在合並結束后多次查詢各個點的信息【例】,就必須新建節點返回,否則節點信息會丟失 (\(1\) 次)。
-
寫 \(\text{FFT/NTT}\) 時注意:如果確定思路沒問題但是連樣例都過不了,\(99\%\) 是初始化數組出了問題(\(\text{inf}\) 次)。
-
寫 \(\text{Trie}\) 樹時注意:節點個數不用乘以字符集大小啊!!!(\(\text{inf}\) 次)。
-
寫主席樹時注意:空間復雜度在 \(O(2n\log n)\) 以上,樹狀數組套主席樹是 \(O(n\log^2 n)\)(\(\text{inf}\) 次)。
-
寫 \(\text{SAM}\) 時注意:在寫 \(\text{SAM}\) 轉后綴樹轉后綴數組時(或者某些題目),需要求 \(pos\) 數組(\(pos[p]\) 表示節點 \(p\) 在原串上的終止位置),則復制節點 \(x\) 到 \(y\) 時 \(pos\) 也應一同復制(\(2\) 次)。
-
寫結構體時注意:兩個大結構體之間的賦值盡量不要直接用 \(=\) 符號,自己手寫個 \(operator\) 暴力 \(for\) 枚舉賦值會快無數倍。【例】(\(1\) 次)。
-
寫 \(\text{LCT}\) 時注意:如果維護了虛+實子樹信息和,在 \(link(x,fa)\) 時要對 \(fa\) 進行 \(access\) 和 \(splay\),避免 \(fa\) 的祖先節點信息缺失(\(1\) 次)。
-
寫動態開點線段樹時注意:一次單點修改的空間為 \(\lceil \log_2 n\rceil+1\),尤其是寫線段樹合並時極易被卡(\(\text{inf}\) 次)。
-
寫可持久化 \(\text{Trie}\) 樹時注意:一次插入的空間為 \(\lceil \log_2 n\rceil+2\)(\(2\) 次)。
-
寫 \(\text{Splay}\) 時注意:\(insert\) 時要給新建的節點設置好 \(fa\) 啊啊啊!(\(\text{inf}\) 次)。
-
寫 \(\text{SAM}\) 時注意:\(while\) 語句里面要在末尾寫
p=link[p];
啊...(\(\text{inf}\)次)。 -
寫 水平序求凸包 時注意:下凸包為 \(P_{1\sim St}\),上凸包為 \(P_{St\sim cnt+1}\) (\(1\) 次)。
-
寫 三進制插頭 \(\text{DP}\) 時注意:在求出 \(Mi\) 數組之后再獲取 \(V\),不要直接寫
V=1<<m+1
(\(2\) 次)。 -
寫最大子段和時注意:線段樹中 \(max,lmax,rmax\) 都初始化為該點權值,但 \(\text{Splay}\) 中的 \(lmax,rmax\) 要初始化為 \(0\),且不能用他們單獨更新 \(max\)(\(2\) 次)。
-
寫 \(\text{Splay}\) 時注意:\(rotate\) 函數在 \(connect\) 后要對 \(fa,p\) 進行 \(pushup\)(\(\text{inf}\) 次)。
-
寫莫隊時注意:把兩種 \(add\) 放在 \(del\) 的前面(且 \(addR\) 要在最前 ),否則會計算到 \(L>R\) 的區間 【例】(\(1\) 次)。
三:【巨佬們的經典語錄集】
【LSY】
-
我真的覺得我的寫法非常簡單,瞬間就想出來了,而且代碼也很好寫,不就是個啟發式合並加樹上懶標記維護動態倍增 \(\text{lca}\) 嘛。
-
大部分題都可以用 \(\text{Trie}\) 樹搞。
【HZH】
-
我要是 \(\text{A}\) 了這道題就去持矢。
-
這次的題好難啊,我只會暴力枚舉(
吊打std的暴力)和輸出 \(\text{rand()}\)(暴切神仙題的隨機)。
【ZTH】
-
我要是 \(\text{rank1}\) 就女裝。
-
我最喜歡調這種玄學 \(\text{bu}\)。
【HYJ】
-
這個妹紙這么可愛,一定是男的!(你在渴望些什么?)
【其他】
我感覺我整個人都自動機了…… ——\(bztMinamoto\)(回文自動機學習筆記)
組合意義天地滅,代數推導保平安。 —— \(tiger0133\)
這不就是個裸的可持久化動態凸包加可持久化動態樹構造廣義后綴自動機轉廣義后綴樹得到后綴數組然后上可持久化動態仙人掌在虛樹上做可持久化動態點分治維護最小費用無源匯有上下界可行流再套上任意模數分治快速數論變換對生成函數多項式求逆跑牛頓迭代的聯賽難度水題嗎?