常見演算法和資料結構存在的坑(updating)

2022-05-01 04:48:11 字數 2895 閱讀 5549

c++陣列下標都+5會穩。

\(5000*5000\)的別開\(6000*6000\)。

實數二分可能因為神馬精度問題出現了不滿足二分序的情況,要小心。

注意二分完後,不能直接用當前陣列裡存的值,要pd(ans),值才是正確的。

無向圖邊的範圍要開2倍。

多組資料要清空的有tot,final

當用到反向邊的時候,tot初值為1(一定要記得賦值)。

for(int i = 1; i <= p0 && (ll) p[i] * p[i] <= n; i ++) if(n % p[i] == 0) -1\)

linux下,\(rand\_max = 2^-1\)

random_shuffle有點假,當隨機性要求高時建議自己隨機交換:

i = 1 -> n

swap(a[i], a[rand(i, n)])

//理論上面的這個比下面的優

i = 1 -> n

swap(a[i],a[rand(1, n)])

//std ::random_shuffle是下面這麼寫的

i = 1 -> n

swap(a[i], a[rand(1, i)])

不要把multiset寫成set了。

且multiset過載《時需要注意不能只過載了值,其餘的附帶資訊最好也加進後續的關鍵字,不然在erase就會出鍋。

普通線段樹:

如果下標有負數的話一定要用位運算,不然會gg。

int m = x + y >> 1;
x,y為int裡面的整數,但是(x+y)可能爆int。

不下傳標記線段樹:

矩形覆蓋問題只能用不下傳標記線段樹,千萬不要卡死在普通線段樹上。

而且不下傳標記線段樹侷限性很大。

隨機手寫會快,但不要偽了

要維護fa時,可以在upd時更新,但是在split和merge開頭,需要:

fa[son[x][0]]=fa[son[x][1]]=0
因為中間過程中可能把乙個點的兒子設空,而這個兒子又沒有新的父親,就更新不到了

網路流多組資料清空的有:

邊集陣列,co,d,cur,其實就是全部要清空。

最小流的時候,\(s\)和\(t\)互換,一般清空\(1 \sim t\)的點,就會清不到\(s\),就錯了。

所以要\(1 \sim max(s,t)\)

第一步的真實流量不是\(ss->tt\)的流量,而是\(t->s\)那條\(\infty\)的邊的流量。

exkmp:

自我匹配時要預處理next[2]。

manacher:

若r包括當前這個點,實際最長回文子串長度等於max(r)-1。

sa:如果有多組資料,則height那裡要加一句話,因為字串的後面可能出事。

原**:

int j, k = 0;

for(int i = 1; i <= n; height[rank[i ++]] = k)

for( k = k ? k - 1 : k, j = sa[rank[i] - 1]; a[i + k] == a[j + k]; ++ k);

現**:

int j, k = 0;

for(int i = 1; i <= n; height[rank[i ++]] = k)

for( k = k ? k - 1 : k, j = sa[rank[i] - 1]; a[i + k] == a[j + k] && (i + k <= n) && (j + k <= n); ++ k);

更新:

另一種寫法,把s[0]和s[n+1]賦inf即可

ps.:

sa還有乙個坑,在多組資料時會掛:

int cmp(int *f, int x, int y, int z)
觀察這一句話,是存在越界風險的:

當f[x]=f[y]時會執行後面那句話,那麼x+w-1、y+w-1都必須<=n,f[x]才可能=f[y]

假設x+w-1=n,則f[x]==f[y]依然可能,此時f[x+w]就越界。

一般來說陣列都會開大幾位,如果預設是0,則沒有問題。

但是多組資料中不是預設為0的,所以要清空後一位。

ac自動機:

標記一定要沿fail鏈傳一下。

sam:

廣義要寬搜。

如果深搜建廣義,就會有空點,然後一些性質就炸了。

實數的話要預先把係數歸一,詳情見板。

在splay裡比如說找中序遍歷第k個點,找完之後一定要把那個點splay一下,不然可能會跑得極慢。

access(x)以後x不是所在splay的根,為了方便可以改一下access的寫法,最後加乙個splay。

cut時,pf[x]也要清空。

link時,最好把x,y都makeroot了,不然在奇妙的子樹維護下可能會出鍋。

fft做的其實是乙個迴圈卷積。

如果\(a*b=c\),其實式子是這樣的:

\(\sum_^n \sum_^nc_+=a_i*b_j\)

這就是為什麼要取》=n的最小的2的冪*2的原因。

所以如果有多次fft,每次做完一定要清空下標大於等於n的。

注意這裡說的n是次數界,如果下標最大是n,次數界是n+1。

還有如果是乙個小mo數,就是一定要算好每次數的範圍,如果太大就不能ntt(除非取多個模數),就要用long double去fft。

其實拉格朗日插值不背這個鍋。

只是乙個n次的多項式一定要n+1點才能確定位置。

而冪次是n的自然數冪和是乙個n+1次的多項式,所以要插n+2個值。

一般插0-n+1。

起點設為最上最左的可以使建完的凸包的向量的幾角(atan2(y,x))遞增。

演算法和資料結構

演算法和資料結構 演算法和資料結構 千絲萬縷的聯絡 縱觀各種演算法書籍,大多都是將演算法和資料結構作為乙個整體來講述。資料結構就是陣列 樹結構等儲存或表現物件資料的結構。將演算法和資料結構作為整體講述,是因為必須依照演算法中的常用操作選擇資料結構。例如,事先將資料儲存在適當的樹形結構中,大多數情況下...

演算法和資料結構

演算法 資料結構與演算法的關係是相互依賴不可分割的。演算法的定義 演算法是解決特定問題求解步驟的描述,在計算機中為指令的有限序列,並且每條指令表示乙個或多個操作。演算法的特性 有窮性 確定性 可行性 輸入 輸出。演算法設計的要求 正確性 可讀性 健壯性 高效率和低儲存量需求。演算法特性與演算法設計容...

演算法和資料結構

好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您,一開始或至少在我的情況下,我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟糕,您會告訴我 您知道,您甚...