一些自己看的的OI小知識
-
判斷某個數能否由一些陣列成可以先對數進行排序然後使用設 \(f_x\) 表示 \(x\) 是否能被組成,然後對於前 \(i\) 個數就有 \(f_x=f_x | f_{x-a_i}\) ,具體題目是 \(noip2018\) \(day1t2\)
-
你去刪除一個元素的時候可以不用說去真正的移除,你可以用一個並查集來標記像後方,表示被移除。並查集進行打標記是一個很有用的思路。
-
實在遇到不會做的題,考慮一下 dp,即使不是正解也絕對沒錯,如果是在樹上做 dp ,不要但考慮在鏈上的不如直接考慮樹上 dp。
-
遇到要求問方案數,沒事就容斥一下,說不定就弄出來了。
-
求某個節點在某個方向上的直接兒子,改為求方向上節點 \(v\)
-
\(\sum_{i=1}^n i^2 = \dfrac{n(n+1)(2n+1)}{6}\)
-
裴蜀定理同樣適用於多元,\(ax+by+cd=t\) 要求 \(t|(a,b,c)\)
-
判斷 \(x\) 是否為 \(y\) 的 祖先,可以記錄 dfs 序進行判斷,看一下對於 \(x\) 的 \(dfs\) 序區間是否包含 \(y\) 就行了。
-
二項式反演:考慮求恰好 \(k\) 個物品的時候,可以按下面兩種方法來做。
設 \(f_i\) 表示至少 \(i\) 個物品時的答案, \(g_i\) 為恰好 \(i\) 個物品時的答案。
然後 \(f_k=\sum\limits_{i=k}^n\displaystyle\binom{i}{k}g_i\)
緊接著 \(g_k=\sum\limits_{i=k}^n(-1)^{i-k}\displaystyle\binom{i}{k}f_i\)
設 \(f_i\) 表示至多 \(i\) 個物品時的答案, \(g_i\) 為恰好 \(i\) 個物品時的答案。
然後 \(f_k=\sum\limits_{i=0}^k\displaystyle\binom{k}{i}g_i\)
緊接著 \(g_k=\sum_{i=0}^k(-1)^{k-i}\displaystyle\binom{k}{i}f_i\)
-
在使用全排列 \(\text{STL}\) 之前記得將序列從小到大排序。
-
對於樹鏈剖分上的東西,一個點到他的父親,最多隻會經過 \(\text{log}\)
-
多測學會清空。
-
遇到區間整體加同一個數多次別去想著直接上資料結構,想想差分,如果差分後仍然數量比較多,不妨想想將差分後的序列再差分,最後只需要做兩次字首和就可以了。
-
將 \(1 \sim n\) 組成排列考慮分成 \(\sqrt{n}\) 塊, 每一塊分別輸出,不斷減小 \(m\) ,可以證明是對的,也就是 CF1017C 。
-
異或相關,考慮使用線性基或者 01 trie 。
-
樹上限制構造次數或者明確遍歷次數為 \(n \log n\) 的時候,考慮輕重鏈剖分,保留重兒子答案,單獨處理輕兒子。
-
哈夫曼樹可以用於平衡線段樹分治中增添刪除不為 \(O(1)\) 的複雜度平衡,這樣複雜度為 \(n \log n\) 。