考場上 Hints
加油啊。
-
心態很重要
-
題目沒有那麼簡單,也沒有那麼難。
-
看題,最好先手玩一下樣例/打個暴力。
-
不要一道題的驗證暴力打很久,按題意模擬即可,不然可能會沒時間想正解。
-
嘗試先多想幾個方向的思路,給出一些看上去比較可行的方案。
-
想到一個思路最好不要馬上打程式碼,再思考一下,想清楚。
-
儘量寫出自己的思路,如果還有可以思考的點就不要放棄。
-
需要分類討論的草稿紙按格式寫,最好能有縮排和層次結構,寫清楚和準確是避免寫不出來的好方法,儘量減少模糊的表述,尤其是模擬,可以用數學語言,限定清楚,把 corner case 寫下來。
-
若干個演算法組合
有哪些不太容易想到的?bitset,Hash,轉成圖上問題,二進位制分組,根號演算法
-
不要一道題做著做著忘了時間
-
做題速度,但是精準度也很重要。
-
多想相似的知識點可能可以使題目更可做/程式碼更好寫。
-
千萬不要忘了題目的限制或者自己多新增限制然後忘了。
-
注意題目的特殊性質(也可以自己想特殊性質),也要考慮不同暴力及其對性質的利用,或者對正解的提示作用
-
如果題目有特殊的格式要求,可以嘗試先寫出程式碼再修改。
-
想清楚再打,如果錯了儘量想清楚再調,一定記得存原本的程式碼。
-
特判 sub 記得陣列開夠,避免 RE。
-
如果是 spj 的一定判斷一下正確性。
-
在儲存的時候記得把 assert 刪去,避免沒想到但是對的情況,可能可以多拿分。
多想為什麼
- 找套路
- 聯絡不同的題
- 會板子,不要被卡科技
- 善於“刻畫”複雜操作/函式
- 多定義輔助思考的 函式/集合 等
- 有些時候不一定要用到所有的性質
- 刻畫複雜限制的時候先別直接開做,思考!
- 若限制的過程是一個可行性判定的問題,且是對於多個考慮限制,可以考慮對偶一下,即透過某些方法把限制作為值。
正確的:第一步讀題目,觀察一會;第二步想到若干個演算法組合,發現思路正確;第三步寫會程式碼,略微修改。
避免:在想到可能的演算法後,仔細想想發現非常複雜,在猶豫中最佳化、修改,甚至會陷入不斷求證的迴圈裡,不知不覺時間就不夠了。
看一下自己寫的一些東西。
需要複習的東西:
manacher
SAM
Treap 和 fhq Treap
可並堆
網路流
自己的部落格
三/四元環計數
tarjan 點雙/邊雙
prufer 序列
計劃
比賽
最近不是很穩,每天都掛很多分,是為什麼呢?
-
題目看錯/忘記限制
- 可以先打個暴力,把限制寫下來,寫清楚!
-
想到正解的旁邊去導致看上去很對但是實際上錯誤
- 根據一些已經有的模型思考:矩陣/圖/多項式/集合冪級數/hash
-
大模擬/大資料結構導致沒有時間寫暴力
- 先大致看一遍題,瀏覽一下題意,給每道題留出時間,有助於把控時間,策略得分
- 想一下能不能用更簡單的東西維護?
- 快速實現,並且先用暴力替代一部分難寫難調的再寫,可以避免整體的除錯。
- 對拍和正解儘量不要用同一個預設源。
-
資料過弱/corner case
- 這個怎麼辦?可以自己寫個暴力和資料生成器*
- 自己注意 corner case,暴力最好是直接模擬,資料生成只根據資料範圍來
-
T4 可能並不是最難的 \(\to\) 題目難度不一定是正序的
- 先瀏覽一遍題目,給每道題留出思考時間,快速實現(替換法減少除錯時間)
-
可以/需要分討的題目,有 corner case 的題儘量寫的好一點,實在不行就特判,但注意 corner case 輸出不要寫錯!
-
頭暈:不要太緊張,打出一道題/想到一道題的思路之後可以上個廁所冷靜一下。
-
多測要清空
-
可能還有一些程式碼上的細節
考場上 Hints
-
不要一道題的驗證暴力打很久,會沒時間想正解。
-
想清楚再打,如果錯了儘量想清楚再調,一定記得存原本的程式碼。
-
特判 sub 記得陣列開夠,避免 RE。
-
題目沒有那麼簡單,也沒有那麼難。
-
多想相似的知識點可能可以使題目更可做/程式碼更好寫。
-
嘗試先多想幾個方向的思路,給出一些看上去比較可行的方案,儘量寫出自己的思路,如果還有可以思考的點就不要放棄。
-
如果是 spj 的一定判斷一下正確性。
-
在儲存的時候記得把 assert 刪去,避免沒想到但是對的情況,可能可以多拿分。
-
暴力不要寫掛(千萬不要忘了題目的限制或者自己多新增限制,新增了別忘了是自己新增的),可以先寫一個暴力?
-
需要分類討論的草稿紙按格式寫,最好能有縮排和層次結構,寫清楚和準確是避免寫不出來的好方法。
-
做題速度,但是精準度也很重要。
-
如果題目有特殊的格式要求,可以嘗試先寫出程式碼再修改。
-
看題,最好先手玩一下樣例/打個暴力。
-
心態很重要
-
想到一個思路最好不要馬上打程式碼,再思考一下。
-
注意 corner case!
-
思考的時候可以把程式碼寫下來,寫的清楚一點,對於複雜的可以一步步細化,但注意不要一開始就錯了。
-
想的太多又不想/寫清楚,會似的。找性質切忌不用筆。
-
遇到一道題可以想一下它可能是由哪些演算法構成的,想到之後可以考慮類似的演算法,但注意還是要從題目整體入手防止走到死衚衕走不出來,如果走不出來了可以先考慮其他演算法,先放著!
-
做題的時候寫清楚,儘量減少模糊的表述,尤其是模擬,可以用數學語言,限定清楚,把 corner case 寫下來。
-
不要一道題做著做著忘了時間,只要想清楚其實可以有效避免頭暈之類的鑽進死衚衕。
-
NOIP 等考試注意題目的特殊性質(也可以自己想特殊性質),也要考慮不同暴力及其對性質的利用,或者對正解的提示作用
-
加油啊。
輔助思考
輔助思考的方法非常重要!
摘錄
對於這個問題,我們可以將序列拆成一系列狀態 \((u, x)\),初始在 \((1, x)\),每次令 \(x\leftarrow F(x, u)\),然後
有哪些不太容易想到的?bitset,Hash,轉成圖上問題,二進位制分組
思維方式
多想為什麼
- 找套路
- 聯絡不同的題
- 會板子,不要被卡科技
- 善於“刻畫”複雜操作/函式
- 多定義輔助思考的 函式/集合 等
- 有些時候不一定要用到所有的性質
- 刻畫複雜限制的時候先別直接開做,思考!
- 若限制的過程是一個可行性判定的問題,且是對於多個考慮限制,可以考慮對偶一下,即透過某些方法把限制作為值。
正確的:第一步讀題目,觀察一會;第二步想到若干個演算法組合,發現思路正確;第三步寫會程式碼,略微修改。
避免:在想到可能的演算法後,仔細想想發現非常複雜,在猶豫中最佳化、修改,甚至會陷入不斷求證的迴圈裡,不知不覺時間就不夠了。
套路記錄
複雜情況
- 情況過於複雜的要寫清楚,如果有多種複雜且難以考慮的情況的,可以嘗試證明某些情況不存在。也可嘗試調整法用於證明。
* 比賽 NFLSOJ
獨立性
平面上點的移動
- 對於可以 \(L,R,U,D\) 移動到 \((x, y)\) 的問題,考慮旋轉 45°,發現變成可以 \((±1,±1)\) 移動,移動到 \((x - y, x + y)\),此時 \(x, y\) 軸獨立,可以分開計算後相乘。
DP 最佳化
-
如果要記錄的狀態太多,可能(應該)是因為影響的因素太多,此時可以考慮獨立性。但其實直接找獨立性不太容易。
-
可以嘗試分析最終答案的性質(調整法,一定不優的不用管),並列舉這個特徵量或者什麼操作,以此來將原本的問題變成一些子問題。
-
如果是直線上有關每個區間選一個點的問題,可以考慮是否存在一個“斷點”使經過這個斷點的區間都在這個斷點上取到最優或者可以分割
-
而且如果選擇的點之間相互影響決策,選擇也沒有順序,那麼就儘量不要一個一個加入?(也不一定)
* 朋友 NFLSOJ
-
-
獨立性非常重要,若是區間最大值作為貢獻的可以考慮最大值並據此分成多種情況。
* 最小化 NFLSOJ
-
位運算+加法
AND
-
考慮從低到高位,因為高位不影響低位,所以獨立性更強!考慮低位到高位!!!
* QOJ And DNA
-
也可考慮從高到低,此時可能是類似線段樹上二分的做法,對於加法記錄一個 max/min 即可代表一個集合。
-
可能劃分階段是核心思想,劃分階段可以使獨立性更強,有些時候獨立性可以是劃分階段後階段間的獨立。
* AGC061E
XOR
-
和異或有關的考慮 Trie 上做 和 一位一位確定答案
-
可以考慮記錄 \(+\) 的限制相關,因為 \(+\) 可以只用 \(\min, \max\) 來刻畫一個集合。
- * [省選聯考 2024] 魔法手杖
DP 過程的前/後效性特別強
- 嘗試考慮最終答案形態(或性質),考慮滿足有任意一個最優解會被 DP 過程得出即可。
- * CF559E
判定性問題
-
在保證有解時,判定解可以從兩方面入手:
- 其為解所必須滿足條件
- 其不為解必須滿足條件(這個比較難想到)
若 1 不符則必不是解,若 2 不符則必是解
* 平行線 NFLSOJ
* CF gym 105170D
限制轉換/模型轉換
不重複序列 \(\to\) 圖上簡單路徑
- 生成一個不重複序列,且 \(a_{i + 1}\) 是 \(a_i\) 根據某種操作轉化/用某種限制限制的,可以考慮在可轉移的兩個元素之間轉化為圖上的一條簡單路徑。
* MX-S4 youyou 的三進位制數 - 單調遞增序列 \(\to\) 區間選點
曼哈頓距離 \(\to\) 完全圖
- 可考慮單純將 \(dis(p_1, p_2)\) 作為可方便計算值的函式,轉而採用完全圖的性質來做。
* [UESTCPC 2024] 2-聚類演算法
多個限制 \(\to\) 確定部分限制後的判定性問題
-
多個限制考慮確定幾個限制後將剩下的轉換成判定性問題(尤其是集合選擇這種一眼 NP-Hard(?) 的?)。
* [省選聯考 2024] 魔法手杖
原本不好做但保證了特殊性質
-
考慮特殊性質的作用,如判定序列上區間的可重集相等,對於相交的可轉為不相交的,若保證了每個數出現次數 \(\le 2\) 則不相交的可以轉化為和上一次出現的位置有關的判定。
* CTT 2022 區間計數
\(\exists\) 區間 \(\to\) \(\exists\) 點
- 若原本為 \(f_{u, seg}\) 表示限制某個 \(x\) 屬於 \(seg\),合併時是區間交,要求不能為空,可以考慮設 \(f_{u, t}\) 為選擇 \(seg\) 中的一個點,相當於轉變為維護這個 \(t\) 的轉移,且每次都在得到的區間中的 \(t\) 一定存在,故取得到。
- * CF1023G Pisces
- = Cakes for Clones MLXIV NFLSOJ
共端點區間 min/max \(\to\) 笛卡爾樹上中序相鄰點對
-
可以嘗試模型的轉化,如果是對於一些共端點的區間的區間最值進行限制,可以考慮在笛卡爾樹上做,但注意將限制的等價表述表述清楚,不然可能會暴斃,可能相當於限制了這個點集不能在 \(u\),和它的左右子樹中同時出現。
-
注意此時可能可以在沒有放的子樹內放一個。
* 超命運樹 NFLSOJ
曼哈頓距離 \(\to\) 切比雪夫距離
- 對於曼哈頓距離,(若 k 比較小且限制的是 max)可考慮轉化為切比雪夫距離。
邊權 \(\rightarrow\) 點權
- 若貢獻為邊權和,且操作為選點,最終答案為 \(\sum\limits_{i, j\in S_1} w(i,j) - \sum\limits_{i, j\in S_2} w(i, j)\),可考慮將邊權分擔在點上,邊權 \(\to\) 點權(選點)。
* [UESTCPC 2024] 2-聚類演算法
點權有向圖 \(\to\) 拆點 \(\to\) 邊權有向圖
-
\((u\to u', w_u), \forall e = (u, v)\in E, (u'\to v, 0)\)
限制是構造一組 \(p\),滿足可逆(不一定相同)的關係
e.g. 使得 \(\forall (u, v, w), p_u + w\equiv p_v\pmod x\)
* ARC144E
異或 \(\to\) 集合冪級數 \(\to\) FWT
-
對於異或可以考慮用集合冪級數來描述問題,先做一遍 FWT 變成對應位置相乘的線性變換,接下來可能會好做許多。
* 輕舟已過萬重山 NFLSOJ
多模態匹配 \(\to\) AC 自動機上 DP
- 注意若是不能走的是將某個的 fail 子樹全部刪除。
- * 放假 NFLSOJ
01 矩陣 \(\to\) 完全二分圖定向/二元函式 01 \(\to\) 邊定向
- \(A_{i, j}\) 的值可以轉成 \((r_i, c_j)\) 間的邊定向,01 矩陣的行/列和可以轉成 \(c, r\) 的度數。
- 若是判斷行/列和相等的可以考慮對於兩個原本相等的 \(A, B\) 去除共同的邊之後,圖由環構成,且恰好是隻存在相反的邊。
ARC186A
- 若是判斷行/列和相等的可以考慮對於兩個原本相等的 \(A, B\) 去除共同的邊之後,圖由環構成,且恰好是隻存在相反的邊。
雜湊 Hash
單調棧 \(\to\) 矩陣 Hash
好牛
- 考慮如果單調棧是相同的彈出,否則加入的話,判斷一個串是否可以剛好消除可以將 a 輪流替換為 \(A^{1}\) 和 \(A^{-1}\),其餘同理,然後按順序乘起來判斷積是否為單位矩陣 \(I\)。因為一個完美匹配的乘積必為 \(I\),而矩陣乘法滿足結合律不滿足交換律(半群性質)。
* 換貓 NFLSOJ
模擬類限制
- 單調棧,加點時,若相同就彈出,否則加入。可以合併,考慮 cdq 分治,可以二分 + Hash 判斷彈出多少個。
* 換貓 NFLSOJ
容斥
為什麼要容斥?
求恰好不好做,可能是由於轉移係數不好算,或者狀態太多。
透過欽定/要求某個限制,使得轉移係數與之前的東西相對獨立,從恰好每個都被選變成可以選任意一個,此時轉移係數只與集合的大小有關。
* [ZJOI2022] 樹
容斥係數
- 容斥的容斥係數沒有那麼複雜,考慮容斥係數的目的實際上是 \(k\) 個的會被 \(0, \dots, k - 1\) 先貢獻一遍容斥係數,加上 \(k\) 的係數後要把它的係數變成 \(1\),其實這個係數應該只與我們怎麼設狀態有關。
均攤容斥係數
- 考慮把答案的式子寫出來,我們可能並不需要求出每個 \(c'\) 的方案數,可以嘗試把所有的係數轉移在轉移過程中均攤掉。
- 有些時候由於二項式反演或者什麼東西的存在,每轉移一步要乘的係數不一定非常顯然,此時可以考慮把式子列出來,也許可以用二項式定理,這樣我們就可以少記錄一位(即欽定的東西),並把這個東西在轉移的過程中均攤掉。
* Ruin the legend
* MX-S6-T4 彩燈晚會
“點減邊”容斥
-
對於樹上問題,限制是 存在某個連通塊集合滿足限制 可以考慮 點減邊容斥,把艾弗森括號 \([\_]\) 轉換成數值,即 \([S\not=\emptyset] = (|\{p\in S\}| - |\{e\in S\}|)\)。
-
欽定大部分時候是為了方便轉移/減少需要記錄的狀態,當轉移係數只與欽定的值有關時可以只記錄欽定的個數,而且最終算答案的容斥係數應該只與怎麼欽定有關,與轉移狀態無關可以獨立成兩個問題考慮。
* [SNOI2024] 公交線路
一類序列容斥計數問題
-
給定 \(M\) 和 \(p_{1\dots n}\),求有多少序列 \(a_{1\dots n}\) 滿足 \(\sum a = M\) 且 \(\forall i\in [1, p_i]\)。考慮如果沒有 \(p\) 的限制可以用隔板法,如果有 \(p\) 的限制考慮欽定某些 \(a_i > p_i\) 即令 \(a_i = p_i + a_i'\),此時減去欽定的 \(p_i\) 後可以用隔板法做,同時如果 \(M, p\) 很大的話可以 meet in middle 和 廣義範德蒙德卷積 做到 \(\mathcal O(n^22^n)\)。
- * 高維碎塊 NFLSOJ
- * HDU-6355 fireflies
DAG 計數(可帶權) - 容斥
- 考慮轉移時列舉入度為 0 的子集/出度為 0 的子集,相當於欽定了新加入的是獨立子圖 和 新加入點的和未加入的點之間沒有 出/入 邊,此時點與點之間變得相對獨立了。對入度為 0 和出度為 0 的都考慮一下!
重要
-
列舉入度為 0 的子集後對於加入的 \(T\),\(T\) 中的點只可能指向 \(S - T\),此時對於每個 \(v\in T\),可以單獨確定它的出度且不會因為後面的改變,可以考慮列舉它的出度。
- * 交換位元 NFLSOJ
- = CF1466H Finding satisfactory solutions
思考:如果 DAG 的權值和每個點的出度/入度有關可以考慮這樣做,如果與入度/出度都有關呢?
期望
可做性
- 能拆開的/獨立的貢獻嘗試分開算,這樣很可能是不劣的(除非可以互補嗎,沒見過)。
- 但注意有可能奇怪的貢獻可以用考慮貢獻的組合意義做,如集合中選點。
- * 腦力 NFLSOJ
計數轉期望
- 感覺很牛,但是我還不會。
- (待補) 不會受到任何處分!我們的教育確有問題! NFLSOJ
- (待補)「MCOI-06」Distinct Subsequences
貪心思想
不考慮一定不優的貢獻
-
如果是兩兩點之間的最優貢獻,可以嘗試不考慮一定不優的點對。
e.g. max(abs(斜率)) 一定在 x 相鄰的兩點間取到。
- * 小島杏花 NFLSOJ
- * CF Gym 105158D 距離之比
DP 的值與某一維度互換(可以分析一下答案的上界或者打個表?)
- 若值為 01 或者 值比較小且滿足某個性質(單調性,只考慮最優的),可以考慮在 DP 的狀態維度記錄其答案,例 \(f_{i, j} = x\to R_{i, x} = \max\limits_{f_{i, j}\le x} j\)。
- * 二分的代價 NFLSOJ
點分治樹
最佳化建圖
- 點分治/toptree 最佳化建圖,可以把每個點拆成入點和出點考慮。
- * 病毒 NFLSOJ
樹上和 dis 有關的轉移
- 如果轉移的順序是一定的且轉移方程和 \(dis\) 有關,可以考慮在點分治樹上維護一個凸包。
- * 計程車 NFLSOJ
- = QOJ 6660
樹上連通塊 DP
-
樹上揹包維護連通塊,如果我們已知某個點一定在連通塊中,按 dfs 序依次取出,若被選則轉移到下一個點,否則轉移到第 \(dfn_u + size_u\) 個點,可以避免合併。
點分治後 DP 做到 \(O(n\log n)\)。
- * NFLSOJ 「PKUSC2011Day1T3」Count on a tree XVI 暴力
- * (待補) 「2018 集訓隊互測 Day 1」完美的集合
四邊形不等式
-
形如 \(f_{i, j} = \max\limits_{k} {f_{i - 1, k} + w(k + 1, j)}\) 時,考慮四邊形不等式,\(w(l, r) + w(l + 1, r - 1) \le w(l, r - 1) + w(l + 1, r)\)。得到四邊形不等式給出了一個決策單調性的充分不必要條件。
- * CF578D
單調棧
字首 max/字尾 max
-
如果是字首 max 個數/字尾 max 個數,考慮單調棧樹,可以分成兩類轉移,即轉移權值矩陣 \(A, B\),考慮變化的位置和量。
線段樹最佳化 DP 的本質也是快速維護 \(A, B\) 的變化,從左到右每個位置都取兩種的最大值。
-
如果是字首 max/字尾 max 並且是一個環,考慮從 max 處斷開,分兩類考慮。
- * 集訓隊互測2022 QOJ5035 foo~
- = 愛麗絲貓 NFLSOJ
判斷能否成為棧底
- 如果是區間裡依次加入問能否成為棧底的,考慮全域性從左往右加,設上一個是 \(pre_i\),那麼答案即為 \(l\le i\le r\) 中 \(pre_i < l\) 的個數。
* NOIO2022 丹釣戰
最佳化模擬
存在一類題,我稱之為“最佳化模擬”。
排序類
對於某個排序的虛擬碼,求進行 k 次後的序列,
- 考慮某個值所在位置的變化
- 考慮某個位置上值的變化
* NFLSOJ 排序
矩陣旋轉,子矩陣加
- 考慮“旋轉”是一個比較難以維護的操作,這是這道題的難點也是突破點,考慮什麼時候旋轉是簡單的,每次都旋轉整個矩陣的時候,因為此時子矩陣內部的“結構”不變,這就是旋轉操作的特點,每次旋轉只有 \(O(n)\) 的相鄰關係會改變,考慮維護相鄰位置即可。
* [SNOI2024] 矩陣
計數
圖計數
圖的限制一般都很麻煩,但一般都比較弱,仔細分析最重要。
- 將難以描述的弱限制單步容斥成相反的強限制
- 將所有情況(給出的圖/答案情況)分為 存在某種結構 和 不存在某種結構,並先考慮其中一種情況(把分類當限制),然後將 存在/不存在 該結構當作前提解決接下來的問題(通常會導致某個較好的限制/結論)。
* [ARC153F] Tri-Colored Paths
環
- 對環的個數計數,可能出現多個環算成一個環, 考慮記錄鏈的個數(一個鏈有兩個插頭,有 \(h, t\)),新加入點的算成 \(1\) 個鏈。
* Horrible Cycles
* NFLSOJ circles
不相交路徑集計數
- LGV 引理,記得考慮某類路徑集的 \((-1)^{t\sigma}\) 是否相同。
- 考慮若有些起點和終點可以同時不選,但權值與有多少條條同時不選有關,可以考慮插值法,連一條權值為 \(x/y\) 的邊,然後插值求 \(x^{r}y^{c}\) 的係數。
- 在斷環為鏈的時候注意是否成多個環(什麼意思)。
* 數集合 NFLSOJ
* [AGC061F] Perfect Strings
計數 DP
一眼結論但不知道是什麼結論的
- 不一定是多項式,不一定是多項式,不一定是多項式!!!
- 考慮整式遞推!!! 即 \(f_i = af_{i - 1} ^ 2 + bf_{i - 2}...\) 這樣。
或者考慮答案的差分陣列/除/對數陣列。
* 序列異或 NFLSOJ
* CF gym 105170A
限制
-
對於不好處理的限制先考察並嘗試簡化限制,再分析操作,如果限制是“存在至少一個”這種,可以將對於限制而言沒有意義的量(例如塊間隨意重排後限制,可以不管塊間順序)壓縮掉/先不管,列舉對限制有影響的量然後算出這種狀態(等價類)中有幾種情況。
* [省選聯考 2024] 重塑時光 -
如果是對於某個 \(x\) 求滿足條件 \(p\) 的 \(y\) 的個數,考慮對於 \(y\) 進行條件 \(p\) 來嘗試簡化。
-
如果限制條件是多種型別的匹配,一定要考慮到重複計數的問題!!!實在不行先跑一部分預處理將匹配變成不會重複計數的,若是限制 \(x\) 有 \(a_x\) 個,可以考慮先把每種滿足的方案的 \(b_i\) 用 dfs 等方式求出來,其中 \(b_i\) 表示滿足了 \(b_i\) 個限制 \(i\)。
* CTT2012 麻將
最佳化轉移
- 如果是 \(f_{S, i} = \sum\limits_{T\subset S} t(S, T)\sum\limits_{j} f_{S - T, i - j} g_{T, j}\) 這種,注意到這是卷積的形式,轉換成多項式後 代入 \(n + 1\) 個不同值,拉插可以 \(O(n3^n + n^2)\)。
- 如果轉移時要列舉兩個量,考慮轉移係數之間是否獨立(相乘也可視為獨立),如果獨立,可以做分步轉移,這樣我們的轉移可以少一個迴圈。
* MX-S6-T4 彩燈晚會
時間複雜度
- 考慮預先欽定某個值可能可以使複雜度減少(大 -> 小,減少無用狀態)
* CFgym105336F - 考慮在用式子最佳化的時候可以把式子寫一起,這樣可能可以交換求和順序降低複雜度
* CFgym105336F
* NFLSOJ 旅行的意義 - 如果 \(n\) 比較小(\(40\) 左右,或者 \(< 100\)),且存在狀壓 DP 做法,可以考慮跑一下有用狀態和轉移,可能可能狀態數/轉移數很少。
* 交換位元 NFLSOJ
= CF1466H Finding satisfactory solutions
簡單遞推
- 如 \(f_i = \sum\limits_{j = 1}^{w} f_j \times t_j\)(其中 \(f_0, t_{1\sim w}\) 已知),要求 \(+,\times\) 滿足三律(?),可以矩陣乘法預處理 \(A^{2^i}\) 做到 \((w^3 + qw^2)\log v\)
* 簡單的有標號有序完全揹包 NFLSOJ
圖論
最小鏈覆蓋
-
給定幾個限制,要求第 \(d\) 時刻 \(p\) 點上有至少 \(f\) 個標記,標記可以隨時間移動,對限制考慮最小鏈覆蓋。
-
偏序集最小鏈覆蓋 = 最大獨立集,圖上可以最小割,樹上可以樹形 DP,線性規劃對偶,把每個標記分別考慮轉化為每個限制考慮。
* CF1023G Pisces
* NFLSOJ Cakes for Clones MLXIV -
對於有未知變數且滿足可減性的,可以考慮拆點後由環來消去其影響,未知變數相當於出點和入點不互相限制。
* ARC144E
有向圖鄰接矩陣
-
鄰接矩陣 \(A\),有 \(A^{k} = A^{k + d}\) 時,\(d\) 為最小迴圈節時,\(d\) 等於圖上每個強連通分量內部的環的大小間的 \(\gcd\) 的 \(\operatorname{lcm}\)。同時最小的 \(k\) 可以透過倍增求出。
* 圖的週期 NFLSOJ
拓撲
- 拓撲排序中,當某個點 \(u\) 出隊時,對於當前任意 \(queue\) 中點 \(v\) 都沒有 \(u\to v\),注意某些時候一些是否只能當場判。
* CF1062F Upgrading Cities
競賽圖
- 完全圖定向後是競賽圖,強連通競賽圖必然存在哈密頓迴路,競賽圖必定存在哈密頓通路,可以透過從哈密頓通路開始,由基礎環一步步構造得到。
* [POI2017] Turysta
分層圖
- 分層圖必然是 DAG,可以 \(O(V + E)\) 求單源最短路。
* 滑冰場 NFLSOJ
無向圖 DFS 樹
- 無向圖任意邊的兩個端點在 dfs 樹上都是祖先後代關係。
QOJ 3023 Winter Festival(考試的時候想到了但寫不出來)
一部分樹上問題
修改和節點相鄰的邊,詢問樹上路徑
-
因為和節點相鄰的邊可能有 \(O(n)\) 條,嘗試把對邊修改變成對點修改,同時考慮將邊的權值視為關於端點的點權的函式,考慮用 LCT/樹鏈剖分 維護。
* [NOI2021] 輕重邊
正權邊帶權中心的帶權距離
即求 \(\min_{rt}\sum_u dis(u, rt)w_u\)
- 考慮對於每條邊,帶權中心即 \(v\) 一定在它的 \(max\) 那一側,所以對答案的貢獻是 \(d_{e}min{\sum w}\)。
* 重心 NFLSOJ
* CF gym 105170J
換根 DP
- 如果是動態根的,既可以考慮 LCT 也可以考慮固定一個根,每次特殊計算移動的貢獻,這樣只用計算一次而不用動態維護貢獻,會方便一點,同時注意我們可以透過 選擇特殊的根(直徑中點/直徑端點等)使得貢獻更加便於計算。
* 樹論 NFLSOJ
樹上兩點距離
- 當然應該嘗試點分治樹。
- 也可以考慮括號序,將兩點間的括號兩兩匹配剩下的就是路徑長度,於是可以用線段樹。
* [ZJOI2007] 捉迷藏
點染色限定同色點對下界 考慮按 BFS 序列舉
-
考慮 BFS 序的性質:
- 對於一個 \(i\) 和其之前的 \(j, k\),有 \(dep(j, k) \le dep(i)\)。
- 對於 \(l = \operatorname{LCA}\{i, j, k\}\) 有 \(dis(j, l), dis(k, l)\le dis(i, l)\)。
按 BFS 序染色相當於限定了點對間的距離。
可以嘗試去證明加入 \(i\) 時,對於所有 \(j, k, dis(j, k\to i)\le x\) 都有 \(dis(j\to k)\le x\),即保證 \(i\) 的 \(x\) 鄰域中的 \(j, k\) 互相都是 \(x\) 鄰域(已加入的)。
也即加入的 \(x\) 對於其所有 \(x\) 鄰域都是直徑端點?因為最深所以最遠?
- * 折枝落夢 NFLSOJ
有關樹上連通塊交集的一個結論
- 樹上給定聯通塊集合,兩兩交集都非空,等價於存在一個公共聯通塊。
* [SNOI2024] 公交線路
* Bus Routes
代價
- 如果代價比較奇怪例如 \(dis(i, j)^{\frac{3}{2}}\),考慮是否是一個凸函式,然後可以嘗試求導。
* CF566C Logistical Questions
虛樹
-
動態維護虛樹邊數:用 set 維護當前點 dfn 序的集合,(先加入 \(id_0 = id_{n + 1} = root\)),加入一個點將 \(prev(it), next(it)\) 取出考慮貢獻即可。
* CF578D
-
虛樹上的邊是原樹上的鏈,有一種奇妙的寫法?
for (int i = 1, iend = V.size(); i < iend; ++i) V.push_back(LCA(V[i - 1], V[i]))
NFLS submission
MST
- 唯一性,欽定一個順序,多種最小生成樹太難思考。
- 考慮出現環的時候去掉最不優的邊或者“即將過期”的邊。
* [JOISC2022] 復興計劃
樹上二分
- 類似點分治的過程,最多 \(logn\) 個點。
* CF566C Logistical Questions
博弈論
輪 + 局
- 如果是重複直到某種狀態的,先考慮最樸素的博弈論暴力:DP 取 max。
- 此時問題在於可能會有環,發現對於每輪,開始的狀態一定的話接下來的期望也是一定的。
- 所以考慮對於所有操作維護一個 3 元組,分別為 \((-1, 0, +1)\) 的期望機率,因為平局方案不變,發現對於一整輪,這個三元組肯定存在最優關係(勝率/(勝率+負率)最大的)。
- 考慮可以二分這個值然後將平局視為這個值,最後判斷開始的期望與這個值的關係,如果算出來的值偏大,說明其餘的貢獻高於二分值。
- 因為平局的期望 = 整局的最優期望,所以考慮固定(二分)整局的最優期望並判定。
* UVA12164 石頭剪刀布
* 猜拳遊戲 NFLSOJ
SG 函式
- SG 函式是下一個局面的 SG 的 mex,也是子問題的 SG 的 xor。
比較難考慮的貢獻
根號分治/根號平衡
- 分成跟 \(> B\) 的有關的 和 都是 \(\le B\) 兩種,前者考慮只有 \(O(\frac n B)\) 個,每次 \(O(n)\),可以考慮預處理某些資訊後建立 虛序列,後者直接 \(O(size^2)\) 即可。
* P8330 [ZJOI2022] 眾數
眾數/出現次數
- 眾數實際上是限制了出現次數,一般 “出現次數” 可以與 根號分治 掛鉤,因為出現次數少的數可以直接考慮出現次數,出現次數多的數可以直接考慮每個數,這樣就出現了根號。
* P8330 [ZJOI2022] 眾數
字串
子串
- 如果和子串有關的可以考慮 SAM 上做,如果限定了 \(begin\_pos\) 考慮在反串上做,可以變成 \(end\_pos\)。
* [SNOI2020] 字串
迴文串
- 迴文串記得考慮二分和 hash。
* 字串 YZOJ
構造
子問題
-
考慮變成子問題,然後考慮如何擴充!
-
考慮子問題到全域性的改變如何維護,不要一直想著貪心或某種一眼錯的策略,子問題,子問題,子問題!因為子問題是構造的重要部分,可以有效減少思考內容和錯誤機率和思維難度!
* 島嶼 NFLSOJ -
考慮變成子問題不僅是 \(n\to n - 1\) 還有 \(n\to \frac{n}{2}\)。
-
排序時可以先考慮 01 的情況然後考慮分治擴充。
* [NOIP2020] 移球遊戲
三角剖分
-
考慮去掉一個 \(d = 2\) 的點後的子問題。
* 島嶼 NFLSOJ
構造方案
-
如果是要求透過某種操作要求從一個狀態轉移到另一個狀態,考慮尋找“基本操作”,可能是由多個本質操作(給出的)組合成的,操作的特點是比較強。
* 俄羅斯方塊 NFLSOJ
* ARC187A
構造二元二次函式(e.g.dis)間的大小關係
- 嘗試構造多次二元函式(e.g. dis)間的大小關係時,可以考慮基於等於後 \(\pm\epsilon\) 的影響,因為這樣的話,不會影響其餘的大小關係,即獨立性強的構造。
* ARC172D Distance Ranking
位運算構造
我也不知道叫什麼
- 考慮把 + 的變成位運算,即欽定相加的兩個數不進位,好處是位運算的階段性/階段獨立性更強,更容易遞迴成子問題求解,同時考慮是否存在關鍵點可以必然可以調整至合法。
* UNR#7 位元迷宮
矩陣構造
- 對於矩陣填數,考慮某一維滿的時候的構造解的方式找到充要條件/必要條件/充分條件,從而先填滿其中一維。
* [SNOI2024] 拉丁方 - 行/列不重複的填數可以考慮二分圖邊染色。
* [SNOI2024] 拉丁方 - 對於某些點未知,某些點已知的賦值,考慮全部已知的情況。
互動
確定未知
- 如果是樹的結構,可以查詢某個點到某個連通塊的距離和,可以考慮先隨機確定根,然後 dep 差 1 的之間考慮,注意某個點具有極多兒子的情況比較容易出問題。
* 樹 NFLSOJ
資訊量/確定未知序列
- 考慮每次都基於全域性,尤其是期望的題,注意得到的資訊若並不是期望最好的,想的可能不是應該怎麼用,而是它的本質是什麼,即代表了什麼,我們的每個決定都應該基於全域性的所有資訊的期望最佳。
* Permutation
確定未知排列長度,每次走 \(x, \bmod n\)
- 我們可以採用 BSGS,但是發現中間要走一些肯定不在上面的很費時間,可以考慮確定排列長度的較好下界,考慮先隨機 \(T\) 個值,那麼其中的 mx 期望是 \(\frac{T}{T + 1} n\)。
* Guess Cycle Length
子序列
- 構造有 \(a\) 個最長嚴格單調子序列時考慮進位制而非因數,具體可以先假設 \(k\) 進位制,在 \(k\times 1 + k\times 2\dots\) 的序列的基礎上構造。
* NFLSOJ 月詠に鳴る
排列
行列式/積和式
- 和排列有關時可能可以考慮矩陣的行列式或者積和式,積和式不好算,但是若判斷積和式是否為 0 的話可以考慮隨機賦權後的行列式(Hash)。
* 輕舟已過萬重山 NFLSOJ
計算幾何
- 一條直線若經過 \(x\) 個點,則必須另外需要 \(x\) 條平行直線才能將其全部覆蓋。
* 平行線 NFLSOJ
* CF gym 105170d
勢能
- 可以考慮勢能,透過哪個勢能是符合要求的來反推做法。
* [THUPC2022 Final]rsraogps
網路流
最小割
- 先把一定不優的去掉,再考慮把選取狀態改為從某個合法狀態開始,一直在合法狀態中調整,即選取 trans。常數真的很小。
* 鋅粉 NFLSOJ
建模
-
我們應該將給定(固定)的東西作為源匯點,本題中乾淨毛巾和髒毛巾可以認為是本質不同的兩種東西,所以我們可以認為顧客是每天得到 \(r_i\) 條幹淨毛巾,返回 \(r_i\) 條髒毛巾。
-
對於我們這個商店,就是每天可以獲得髒毛巾,然後要求返回乾淨毛巾。
-
也就是說,源匯點應該是不變的東西?
* 餐巾計劃問題
結論
- 一個排列交換任意兩個數,逆序對總數一定改變。
(LGV 引理) - 一棵二叉樹,若將只有一個兒子的點壓縮,則最終的樹高 \(\le \sqrt n\)。
* CF1168D Anagram Paths - 問區間中有多少相同顏色對數,時間複雜度 \(O(n\sqrt n)\)
* [Ynoi2001] 冷たい部屋、一人
NP-Hard 問題特解
集合覆蓋問題求方案數
- 如果點數較少或者如果點數較多但是可以分成相對獨立的 \(m\) 個集合,集合之間不獨立的點有 \(n\) 個,每次詢問要求每類集合中至少選一個則可以集合並卷積快速維護,複雜度是 \(O(mn 2^n)\)。
* [省選聯考 2022] 卡牌
二分圖
二分圖最小點覆蓋等於最大匹配
- 先貪心,再建模可能可以得到更可做的模型。
* [USACO05JAN] Muddy Fields G
判定二分圖是否可以匹配
-
不一定要跑 Dinic,若有一邊的點數特別小,考慮列舉這一邊 \(S\) 然後要求鄰域滿足 \(|N(S)|\ge |S|\)。此時 \(S\) 每個都可以被匹配。可以使用高維字首和最佳化。
* [COTS 2019] 疏散 Sklonište
集合冪級數
- 如果集合異或卷積,形如 \(\operatorname{FWT}(1 + x^{\{u, v\}})y\) 的,考慮 \([x^S]\) 可能會有 \(= 1\pm y\) 此時可以列舉最終的 \([x^{S}]FWT(H) = (1 - y)^a (1 + y)^{m - a}\)(點乘!!!),計數有多少個 \(S\) 使得取到 \((1 - y)^a(1 + y)^{m - a}\) 且 \([x^{\varnothing]}]H\) 可能可以根據 FWT 的定義快速計算單點的值。
* 環覆蓋 NFLSOJ
= 2022 集訓隊互測 環覆蓋
貪心
- 對於對 \(x\) 做操作使得 \(x_i\ge y_i\),等價於 \(y_i\) 做反操作使得 \(y_i\le 0\),同時考慮操作具有限制,可以把對操作的限制轉成對最終 \(x_i\) 的限制,即從某個 \(x\) 變成 \(y_i = 0(1\le i\le n)\)(如果代價和 \(x_i\) 的值聯絡緊密如 \(\sum x_i\))。
* Add One 2
組合數
- 若有組合數相除求和,考慮拆成階乘後轉換形式使得分母固定並提取出來。
* CF1392H ZS Shuffles Cards
* 不朽之蜍 NFLSOJ
二元函式求平面矩陣上最值
- 若限定 \(x\le y\) 考慮把矩陣拆成 \([l_1, r_1], [l_2, r_2]\) 相同/相離後統計最值。
* 大戰殺馬特 NFLSOJ
還沒有類似的多個用於歸類的 Trick
二次剩餘/快速判斷完全平方數
- 考慮平方數的性質。從冪次為偶數入手的話你會發現分解絕對超時。從平方入手,既然是平方數那麼一定存在二次剩餘。
- 考慮二次剩餘的性質非常好,用 \(p\) 個質數隨機獲取其二次剩餘並記錄(若能整除則判斷其餘因數),要求異或值為 0,因為在 mod 意義下,若為完全平方數則必為二次剩餘,否則機率是 \(\frac 1 2\)?
* [SNOI2024] 平方數
維護多項式用於求值
-
如果是給定 \(a\),要求對於不同的 \(x\) 快速求 \(\sum\limits_{i} \prod\limits_{j\in C_i} (a_i + x)\) 這種的,考慮維護一個多項式!
-
如果有模數且為 \(u^v\),發現若 \(x = ku\),則 \(x^v\bmod u^v = 0\),所以考慮把 \(x\) 拆成 \(ku + b\),用多項式的好處是可以改變點的貢獻(原本為 \(1\) 現在變為 \(x + *\))。
-
是多項式而不是進位制,因為進位制不夠本質/簡潔,要考慮的東西反而更多。關於如何在考場上從進位制轉換到餘數:我也不是很清楚,考慮在想到一些相關的知識點和思路的時候考慮一下相似的知識點可能可以變得更可做。
* 傳自我的手機 NFLSOJ
二叉樹上字典序
-
可以考慮給左邊 (保證右邊的第一個 > 左邊的第一個) 或者 (保證先左邊再右邊) 兩個情況所需的最小值後其餘全部給左邊,保證左邊最小後剩下的給右邊。
* [省選聯考 2024] 迷宮守衛
模擬
- 寫的詳細一點,清楚一點,分類分清楚非常重要。
- 對於模擬(可能需要最佳化的),先把暴力寫出來,即可能出問題的地方先模組化的時候用暴力代替。
- 模擬可能需要轉化成其他模型,這個需要注意寫清楚,可以考慮用結構體封裝,介面要對好。
- 模組化並不是萬能的,有些時候不 good 的模組化反而會導致程式碼寫不清楚!!!尤其是跳來跳去的這種。
- 寫的詳細一點,最好不要省略。
* NOIP2022 喵了個喵
* 網頁 CSS(NFLSOJ)
平面最近點對/平面周長最小三角形
- 考慮分治,先按某個 \(x\) 分成兩個集合,得到子問題的解後,再只嘗試更新可能更優的點對,可以證明覆雜度為 \(\mathcal O(n\log n)\)。
麻將題
- 看懂規則,其實應該可以做的。
- 如果限制比較簡單,其實並不難。
* 拉密 NFLSOJ
一些小 Trick
觀察
- 某些題目可能可以透過觀察大樣例得到一定的提示,但是想透過觀察(大)樣例直接推出結論就像企圖透過觀察素數螺旋發現推出線性篩一樣不太可能。
二進位制分組
- 不太容易想起來的技巧,思想是對於一個集合計算兩兩不同的最值時,考慮列舉對答案貢獻的兩個元素重新標號後二進位制意義下不同的位置在哪。
樹套樹 \(\to\) cdq 分治
- 如果能用樹套樹的考慮能不能用 CDQ 分治最佳化,會好寫很多。
* 歌劇演員 NFLSOJ
判斷特殊情況
- 注意想到哪些不可能/特殊的情況可以先判掉,簡化題目的條件和情況,有可能存在除了特殊情況外的正解。
* [ARC153F] Tri-Colored Paths
補丁
- 如果程式碼掛了,可能是錯了一個小點,比如某個情況沒有考慮到,說不定可以打個補丁?總而言之,不要放棄希望。
* 超命運樹 NFLSOJ - 跟子序列有關的限制,如果發現了對相鄰元素的限制,而這是必要不充分條件,可以考慮兩兩限制 \(|i - j|\) 和 \(|a_i - a_j|\) 的關係。
* NFLSOJ 相似數列
二維數點
- 二維數點需要分析清楚情況,把過於具體且繁瑣的自然語言限制轉為用數學語言/程式碼表述的便於可能更加便於套路最佳化的形式。
* 刷牆 NFLSOJ