1. 程式人生 > 其它 >一些自己看的的OI小知識

一些自己看的的OI小知識

「不知不覺兩個人的記憶 幸福會來拜訪嗎 」
  1. 判斷某個數能否由一些陣列成可以先對數進行排序然後使用設 \(f_x\) 表示 \(x\) 是否能被組成,然後對於前 \(i\) 個數就有 \(f_x=f_x | f_{x-a_i}\) ,具體題目是 \(noip2018\) \(day1t2\)

  2. 你去刪除一個元素的時候可以不用說去真正的移除,你可以用一個並查集來標記像後方,表示被移除。並查集進行打標記是一個很有用的思路。

  3. 實在遇到不會做的題,考慮一下 dp,即使不是正解也絕對沒錯,如果是在樹上做 dp ,不要但考慮在鏈上的不如直接考慮樹上 dp。

  4. 遇到要求問方案數,沒事就容斥一下,說不定就弄出來了。

  5. 求某個節點在某個方向上的直接兒子,改為求方向上節點 \(v\)

    \(dep_v-dep_u-1\) 級祖先

  6. \(\sum_{i=1}^n i^2 = \dfrac{n(n+1)(2n+1)}{6}\)

  7. 裴蜀定理同樣適用於多元,\(ax+by+cd=t\) 要求 \(t|(a,b,c)\)

  8. 判斷 \(x\) 是否為 \(y\) 的 祖先,可以記錄 dfs 序進行判斷,看一下對於 \(x\)\(dfs\) 序區間是否包含 \(y\) 就行了。

  9. 二項式反演:考慮求恰好 \(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\)

  10. 在使用全排列 \(\text{STL}\) 之前記得將序列從小到大排序。

  11. 對於樹鏈剖分上的東西,一個點到他的父親,最多隻會經過 \(\text{log}\)

    條輕邊,有時可以根據這個,用資料結構維護重鏈的操作,輕鏈上的進行暴力,複雜度仍然是對的。

  12. 多測學會清空。

  13. 遇到區間整體加同一個數多次別去想著直接上資料結構,想想差分,如果差分後仍然數量比較多,不妨想想將差分後的序列再差分,最後只需要做兩次字首和就可以了。

  14. \(1 \sim n\) 組成排列考慮分成 \(\sqrt{n}\) 塊, 每一塊分別輸出,不斷減小 \(m\) ,可以證明是對的,也就是 CF1017C 。

  15. 異或相關,考慮使用線性基或者 01 trie 。

  16. 樹上限制構造次數或者明確遍歷次數為 \(n \log n\) 的時候,考慮輕重鏈剖分,保留重兒子答案,單獨處理輕兒子。

  17. 哈夫曼樹可以用於平衡線段樹分治中增添刪除不為 \(O(1)\) 的複雜度平衡,這樣複雜度為 \(n \log n\)