基本的方法
定一移一
很多雙變量情況,可以先固定一個(gè),然后變化另一起,防止雙變換帶來的不確定,與時(shí)間上的復(fù)雜。
二分答案
這也是固定雙變量問題的好方法,而時(shí)間復(fù)雜度只增加的一個(gè) \(\operatorname O(\log n)\)。沒事就想想二分答案。
二分答案可以固定一層限制,如選的點(diǎn)等等。大小的限制等等。對于難求的值也可以使用。可以使代碼更簡潔明了。
統(tǒng)一恒定
對統(tǒng)一的值進(jìn)行標(biāo)記、賦值,可以減少錯(cuò)誤增加效果
整體移動(dòng)
即跳過全部的,剩下的就是空的。
如:一組標(biāo)記為 \(-1,-2,\dots,-n\) 的數(shù),和一組標(biāo)記為 \(1, 2, 3,\dots, n\) 同時(shí)存儲(chǔ)。只需把負(fù)數(shù)取正然后統(tǒng)一加 \(n\),即可(即跳過正數(shù)組的下標(biāo)區(qū)間)。
進(jìn)制式轉(zhuǎn)換(二維坐標(biāo)一維化)
按照進(jìn)制模式生成不重復(fù)的下標(biāo),如一個(gè)點(diǎn) \((x,y)\),假設(shè)這個(gè)矩陣大小為 \(n \times m\) 那么就可以用 \(k = max(n, m)\) 進(jìn)制在第一位存 \(y\),第二位存 \(x\)。
如 \(5\) 進(jìn)制中,第一位權(quán)值為 \(1\),第二位權(quán)值為 \(5\),每位可以存下 \(5\) 個(gè)數(shù)字 \([0,4]\),可以將橫縱坐標(biāo)放入對應(yīng)位中構(gòu)成 \(5\) 進(jìn)制數(shù)字,如點(diǎn) \((3,4)\) 可化為 \(5\) 進(jìn)制下的 \(34 (5)\) 即十進(jìn)制下的 \(19 (10)\),用這個(gè) \(19\) 作為下標(biāo)進(jìn)行儲(chǔ)存。因?yàn)樵?\(k\) 進(jìn)制下,下標(biāo)不會(huì)重復(fù),所以在十進(jìn)制下的下標(biāo)也不會(huì)重復(fù)。
即點(diǎn) \((x,y)\) 的一維化下標(biāo)為 \(x \times k + y\)。
按位分離
即將一個(gè)數(shù)字按每一位分離的方法。一般是通過取余 10,再除 10,不斷得到最后一位數(shù)
一般代碼為:
vector<int> res;
while (x)
{
res.push_back(x % 10);
x /= 10;
}
時(shí)間、空間與實(shí)現(xiàn)
一般來說,用空間換時(shí)間,用時(shí)間換代碼的實(shí)現(xiàn)難度。
在空間允許下,用空間換時(shí)間是一種非常好的方法,而用時(shí)間換實(shí)現(xiàn)難度,是為了方便維護(hù),減少思考成本。從而更快得解題
背包的條件限制
如果把體積當(dāng)成價(jià)值來看的話,那么我們做一個(gè)限制大小為 \(j\) 的背包,就相當(dāng)于,找出不超過 \(j\) 的最大值,那么正反都做一遍,那得到的就是最接近 \(j\) 的值。這是一種很牛的趨向找法。
如這題的 01 背包做法:P2392 kkksc03考前臨時(shí)抱佛腳 - 洛谷
本質(zhì)上,背包就是求在有限制情況下的最值或方案數(shù)。
數(shù)據(jù)的精準(zhǔn)分析
對于時(shí)間,進(jìn)行精準(zhǔn)分析判斷是否可行。
數(shù)值標(biāo)記
我們往往可以用一個(gè)數(shù)來標(biāo)記一個(gè)點(diǎn)的存在,最后統(tǒng)計(jì)就直接求數(shù)的和就可以了。
利用一些可以互相消去的數(shù)值,進(jìn)行統(tǒng)計(jì),會(huì)有意想不到的效果。
如,求區(qū)間覆蓋次數(shù):我們可以給一個(gè)區(qū)間的左端點(diǎn) \(l\) 標(biāo)記為 \(1\),右端點(diǎn) \(r\) 的下一位標(biāo)記為 \(-1\),那么只要在 \([l,r]\) 內(nèi),求 \([1, x]\) 的和就能算出有多少區(qū)間覆蓋。
如這題:P14239 [CCPC 2024 Shandong I] 多彩的線段 2 - 洛谷 就可以這樣操作。
數(shù)值標(biāo)記,使用前 \(n\) 個(gè)和的方法,化區(qū)間修改,單點(diǎn)查詢,為單點(diǎn)修改,區(qū)間查詢。
目的效應(yīng)
對于動(dòng)態(tài)處理的東西,我們可以嘗試去預(yù)處理,使其在某一點(diǎn)直接處理完畢。無論什么事情我們只講求目的,比如,我們要把特定物體在特定是時(shí)間消失,那么每次找出特定石頭,可能需要遍歷所有物體,而我們可以提前找出每個(gè)石頭應(yīng)該在哪里消失,然后在到那一次的時(shí)候直接處理結(jié)果就行。簡單說,我們可以 “求” 出目的,即正著推出,也可以找出每個(gè)目的的歸宿,直接效應(yīng)。

浙公網(wǎng)安備 33010602011771號