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))遞增。
演算法和資料結構
演算法和資料結構 演算法和資料結構 千絲萬縷的聯絡 縱觀各種演算法書籍,大多都是將演算法和資料結構作為乙個整體來講述。資料結構就是陣列 樹結構等儲存或表現物件資料的結構。將演算法和資料結構作為整體講述,是因為必須依照演算法中的常用操作選擇資料結構。例如,事先將資料儲存在適當的樹形結構中,大多數情況下...
演算法和資料結構
演算法 資料結構與演算法的關係是相互依賴不可分割的。演算法的定義 演算法是解決特定問題求解步驟的描述,在計算機中為指令的有限序列,並且每條指令表示乙個或多個操作。演算法的特性 有窮性 確定性 可行性 輸入 輸出。演算法設計的要求 正確性 可讀性 健壯性 高效率和低儲存量需求。演算法特性與演算法設計容...
演算法和資料結構
好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您,一開始或至少在我的情況下,我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟糕,您會告訴我 您知道,您甚...