獨家&偏門Tricks

已經寫了好多好多,既是我畢生所學的彙集,又是從10歲到16歲的成長日記.希望每一個看過的人,都能有自己的一份收穫.

  1. 善用CtrlCV,加快打字速度。

  2. 認真訓練,不要CB!

  3. 調試用代碼要註釋於旁邊 比如/*調試*/

  4. 不吝嗇於打註釋 尤其是思路不清晰時(當然最好還是想得很清楚了再開始)

  5. 邊集數組2 線段樹數組4 etc.
    至少判斷每個數組的空間是否夠 打代碼時也要考慮越界問題
    原因: C++ 本身不可能報數組越界 只知道把指針瞎指

  6. 不要隨意全開 ll 平時偷個懶問題不大

  7. 比賽前一天晚上好好睡覺! 早起牀,喫好早餐,別碰咖啡

  8. Ctime 中的 clock() 可以用於算運行時間 time(0) 用於 srand()

  9. (tmp)等價於 (tmp!=0) 而非 (tmp>0)

  10. 比賽裏的題目順序不要管!血淋淋的例子GDKOI2018Day1

  11. O2要求十分嚴格 可能導致RE 所以不必要就別開

  12. 函數不要作爲循環範圍(如ve[].size()) 建議記下來再用

  13. vector 可能導致空間&時間二倍 也可以通過提前reserve防止其按二進制分配空間

  14. 當題目複雜時,確立單一觀察對象思考 例:各類hanoi

  15. double 不能用memset賦極值(清空海星) 看上去值沒問題 比大小時會出鍋

  16. struct 的 memset 需要使用 memset(&t,value,(sizeof t)或(sizeof(struct_name)));

  17. 某種情況計算多次時 記得先考慮情況數是否整除 則考慮算完總數後作除法

  18. 搜索順序對時間影響巨大 不確定時可以對拍尋找較快順序(反正只用改一點點)

  19. 如果搜索題目剪枝編程複雜度較高 建議先打基本版 然後去做其他題 最後當提答題玩一玩差不多了

  20. Hall定理:存在從V1到V2的完全匹配 當且僅當V1中任意k個頂點至少與V2中k個頂點是相連的

  21. __Int128的輸出要判斷正負數

  22. 對於大部分關於集合{x|x=f(y),y屬於S}

  23. 三維問題都可以採用 枚舉(排序)一維+分治一維+數據結構一維

  24. 可以認爲T(動態開點)=3*T(離線離散化) 所以不要輕易作死!!!

  25. LL比INT慢一倍!!!!

  26. cmd的fc是不忽略行末空格&(\r\n)的

  27. 打表拆係數是個好方法嚶嚶嚶

  28. 如果不知道怎麼做就嘗試重新描述題目吧!

  29. 有時在dfn很難線性實現時 不如改成類記憶化搜索吧!

  30. 當複雜度涉及已刪除點時 要考慮被刪除者是否被掃描 當複雜度涉及已刪除點時 要考慮被刪除者是否被掃描

  31. 不要輕易推翻原有的結論 很可能是極端條件雜糅(某些極端不共存)
    況且腦子還是新鮮的好用[嚇]

  32. 對拍時 請再三檢查隨機數據的一般性和暴力的正確性

  33. 變元矩陣樹定理:
    令A[i,i]=\sum e[i][j],A[i][j]=-e[i][j];注意負號!
    刪去第r行第r列(1<=r<=n) 後,det(A’)就是各個生成樹的邊權積的總和

  34. 求行列式的N^3做法:高斯消元(行列加減)成上三角 此時答案就是對角線上(n-1)個量的乘積

  35. 穩定的排序算法:(帶序號)相同元素結果穩定 而非時間

  36. 大部分C++程序數組下標從0開始(記得因爲初賽掛過&看標慢)

  37. 有這樣一類題目:邊權=兩點點權異或/gcd/… 求最小生成樹 一般可以先把一些點(如點權相等)並在一起簡化題目

  38. 然後!如果需要求方案數,需要算上最開始合併那些點的方案貢獻(n^(n-2))

  39. 各類DP都可以考慮打成記憶化 好用範圍:冗餘狀態多

  40. n個點n條邊是環套樹!爲什麼我以前一直不知道[捂臉emoij]

  41. 康託展開:一個排列的排名爲 \sum [a_i爲左的逆序對個數]*((i-1)!)
    逆康託展開 從第一個填什麼或者從最小值位置開始考慮

  42. 考前三日 辛辣是禁忌 沒有爲什麼!!!

  43. sort區間左閉右開

  44. 簡記tarjan 邊雙:去掉割邊 再給每個聯通塊染色 割邊(x,y)滿足low[y]>dfn[x]
    點雙:當dfn[x]==low[x]時 當前點爲割點 所以 比它dfn大&&沒有被其他割點隔開的部分都屬於這個點雙 具體說來 開一個棧保存當前遍歷到的部分 跑完子樹後判x是否爲最高點 (因爲手推出鍋太多次所以廢話嚶嚶嚶)

  45. 多次提醒:請勿在意比賽題目順序!

  46. 注意思維和代碼的統一,不要出現多種貪心/博弈/DP/…策略雜糅的情況
    阿我知道只有我纔會人格分裂式想題

  47. 樹狀數組:單點修改&前綴查詢 套各種差分可以完成各種區間操作

  48. 根據期望可加性 可以把期望理解作轉移時的權 僅對本次轉移產生直接影響

  49. 數據範圍最好再三看看 養成先檢查常量定義和數組大小的習慣

  50. 對修改二進制分組:用於處理“(強制在線&)各個修改獨立貢獻”的一類問題
    原理:把修改按時間順序分組 詢問時在每組分開處理分開貢獻 通過合併末尾相鄰兩組 把每組大小控制爲2^i形式

  51. 樹的哈希:對於無根樹 取其重心爲根;有兩個重心時 規定hash值小的爲根;
    (點有序)有根樹和括號序一一對應 計算其括號序的哈希值即可
    具體說來 記f(x)爲x的子樹的hash 那麼f(x)=v(x)+(f(son)異或和) 異或是爲了防止子樹遍歷順序影響哈希值
    重點注意:不要對中途異或值取模!不要對中途異或值取模!
    至於v(x) 我是隨便取了 dep_x*du_x 反正只要是有根樹上點的穩定性質應該都是可以的

  52. 如果想到的可優化部分既不是瓶頸又很難實現的話…那就別實現了唄[吐舌]

  53. 求環時一般是點雙 因爲邊雙的八字形特例 一個點可以存在於多個點雙

  54. 慢慢地你會發現 一些經典問題的推法只需要看思路 因爲別人的推法可能繞很多圈子

  55. 其實多個splay是可以共用 0 爲根的 僅當你不需要0的son信息

  56. 齊肯多夫定理:任意正整數n都可以被唯一表示爲若干個不連續的斐波那契數的和
    證明:考慮貪心構造解 注意到f_i+1=前i-1項不連續的斐波那契數的最大和 每次取p使得 f_p≤n<f_{p+1} 若不取f_p 前p-
    項顯然無法出解

  57. 斐波那契博弈:先手必敗當且僅當石子數n屬於斐波那契數列
    證明:設n爲第一個不滿足結論的數
    當n=f_p
    ①考慮先手第一次取x,則x<n/3<f_{p-2} 故石子可以看作兩堆f_{p-2}和f_{p-1} (因爲先手無法一次取完第一堆) 由設可知後手總有方案取得第一堆最後一個石子
    ②又設此時後手最後一次取了q個石子 顯然q≤f_{p-2}/3 又易證f_{p-2}/3<f_{p-1}/2 可知在第二堆先手也無法一次取完
    當n≠f_p 根據齊肯多夫定理 設n=\sum f_{a_i} a爲有序數列,且不連續
    自此斷言 先手可以取完f_{a_1} 此時剩下的f_{a_i}可視爲互相獨立的子游戲 每個都是後手必勝局面 得證

  58. bitset 是個好東西 對空間也有Ω(一般考慮爲1/32)的優化 e.g.JZOJ5932 所以有些空間好像爆炸的做法也可以考慮

  59. O(n)求1~n逆元 inv_i=(-mo/i) * inv_{mo%i} 證明:設mo=ip+qmo=i*p+q 則 模意義下ip=qi*p=-q 同時除以iq得證

  60. 可以給予參數默認值(e.g:max(int a, int b=10))由於實參和形參是從左到右對應匹配的,所以帶默認值的參數必須要在所有參數列表的右邊

  61. 競賽是中學生活的附加,是一份bouns,所以沒有所謂辛苦!

  62. 伯努利數求自然數冪和
    在這裏插入圖片描述

  63. 神祕滑稽小質數(cc)1109 (infleaking)727 (ilnil)311 神祕滑稽小質數(cc)1109 (infleaking)727 (ilnil)311

  64. 考場Debuff很正常,如果出現了 不要慌張。對自己要有自信!場上用平時雙倍時間寫出代碼和對拍。參考PION7102和JZOJ5938兩次經歷 本以爲需要一個小時實現的東西20min就打完了

  65. 時間複雜度如果比較卡最好測測極限數據,出題人常常在此設置30左右的區分點

  66. 競賽圖中,勝者向敗者連邊,將出度排序後得到序列s,其爲合法比分序列當且僅當\forall k<=n,\sum_{i=1}^{k} s_i >= C(k,2)

  67. 圖上應用根號思想:m*sqrt n求(無向圖)三元環 考慮按度數將點分類 將邊定向作度數大連向度數小 此時枚舉點x每條出邊 打上標記 再枚舉(x,y)中y的每條出邊(y,z) 若z被標記 則(x,y,z)合法 根據構圖 一條邊作爲度數大點時出邊被枚舉一次 作爲度數小點出邊時被枚舉至多sqrt n次 而度數大的點至多sqrt n個 最壞情況總複雜度O((m+n)*sqrt n)

  68. 對於可以離線的撤銷操作 可以理解爲把一個操作作用於一個時間區間

  69. 別太自信了…有時候你調試了一個小時只是因爲某一次你手抖把L打成R之類的 所以半小時時候就可以靜態查錯

  70. 能不用實數就不用實數!@SjJ 100p->0p

  71. 猜到了結論一定要證明,如果沒有證明頭緒就拍!有些看上去很假的結論實際是真的QAQ 參見JZOJ5950

  72. 點積=投影模長=a.xb.x+a.yb.y,叉積=a順時針掃到b的有向面積=a.xb.y-a.y*b.x

  73. 負數取模不穩定!所以如果需要取模要轉絕對值

  74. 你以爲你的樹套樹真的答案正確麼?!比賽打樹套樹我就是狗!!

  75. 兩個組合數式子的本質都是從一個C(m,n)=C(m-1,n-1)+C(m-1,n)起點 考慮兩種情況 C(m-1,n)空缺或者C(m-1,n-1)空缺 在這裏插入圖片描述

  76. 上下界網絡流在這裏插入圖片描述

  77. 請看清自己的變量名 如d[i]&de[i]&dep[i]

  78. 注意點分治的作爲過重心的點 在每個函數中都要ban掉

  79. 平面圖(邊不交叉)套路:對偶圖,即面看作點,原圖中每條邊強行轉成邊(連接所分割的兩個面)
    記原圖G,對偶圖G*,那麼有性質
    (1) 求最小割 想象原圖中過s,t作直線 把直線所分割的兩部分作爲新的源和匯 參考MaxMercer
    (2) 多邊形三角剖分一定爲一棵樹 參考BZOJ4449(對偶圖上)點分治

  80. (常用於Ex歐拉定理)有結論:對於phi(phi(…(m)))=1 出現的有效phi運算次數爲log(m)

  81. 歐拉定理要求Gcd(模數,底數)=1 拓展歐拉定理則有要求

  82. 再次強調!CMD的fc比較不忽略行末空格!

  83. cmd內支持絕對路徑,例fc D:\my\a.out D:\my\a.ans

  84. 如果開O2就WA 很可能是數組越界!

  85. 當n不等於1時,n所有因子的莫比烏斯函數值的和爲0

  86. 狄利克雷卷積:對於F*G=A 有A[n]=\sum f[n/d]*g[d] 也就是n的每組約數對應相乘並求和

  87. 小Trick: 樹上信息合併時 保留重兒子信息 暴力清空輕兒子整個子樹信息 注意到一個點到根的"重鏈頂"最多有log個 所以一個信息最多被插入刪除log次

  88. Polya定理在這裏插入圖片描述

  89. Ex歐拉定理在這裏插入圖片描述

  90. 莫比烏斯反演式
    在這裏插入圖片描述

  91. DP套路:把某個操作貢獻拆開 (其實就是這道題Train辣)
    在這裏插入圖片描述

  92. 請看清自己的變量名 如d[i]&de[i]&dep[i]

  93. 注意點分治的作爲過重心的點 在每個函數中都要ban掉

  94. 平面圖(邊不交叉)套路:對偶圖,即面看作點,原圖中每條邊強行轉成邊(連接所分割的兩個面)
    記原圖G,對偶圖G*,那麼有性質
    (1) 求最小割 想象原圖中過s,t作直線 把直線所分割的兩部分作爲新的源和匯 參考MaxMercer
    (2) 多邊形三角剖分一定爲一棵樹 參考BZOJ4449(對偶圖上)點分治

  95. (常用於Ex歐拉定理)有結論:對於phi(phi(…(m)))=1 出現的有效phi運算次數爲log(m)

  96. 歐拉定理要求Gcd(模數,底數)=1 拓展歐拉定理則有要求

  97. 再次強調!CMD的fc比較不忽略行末空格!

  98. cmd內支持絕對路徑,例fc D:\my\a.out D:\my\a.ans

  99. 如果開O2就WA 很可能是數組越界!

  100. 當n不等於1時,n所有因子的莫比烏斯函數值的和爲0

  101. 狄利克雷卷積:對於F*G=A 有A[n]=\sum f[n/d]*g[d] 也就是n的每組約數對應相乘並求和

  102. 小Trick: 樹上信息合併時 保留重兒子信息 暴力清空輕兒子整個子樹信息 注意到一個點到根的"重鏈頂"最多有log個 所以一個信息最多被插入刪除log次

  103. 裴蜀定理:對於gcd(x,y)=d,一定存在整數a,b使得ax+by=d

  104. 四聯通網格圖是二分圖(黑白染色)

  105. 極大獨立集:不存在"一個不在點集中的點"可以被添加.

  106. 無向圖可以 3-染色 的充要條件是:記圖G=(V,E),存在一個極大獨立集P,使得點集(V-P)爲二分圖

  107. 求最大獨立集算法Bron-Kerbosch:其實這個算法是求極大獨立集,求最大獨立集時需要逐一比較!算法本質是搜索優化,枚舉新點時採用另一枚舉方式,即先取一點A,記點集U={A}∪{與A相鄰點},則該點集中至少有一點被選入極大獨立集,枚舉這一點選擇,並重復此過程. 具體實現時,採用二進制壓位,設函數dfs(R,P,X),R爲必選(合法)點集,P爲可選點集,X爲已知不可選點集.取那一點A時,儘可能使對應的點集U小(篩去已知必定合法點和必定不合法點),可以證明時間複雜度O(3^{n/3}),差不多可以跑100(複雜度實際不滿).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章