acm常見模板1(搬運 總結)

2021-10-04 18:36:06 字數 1565 閱讀 3466

1》位運算技巧:

求n的第k位數字:n>>k&1

返回n的最後一位1:這裡用到了樹狀陣列的lowbit,即lowbit(n)=n&(-n)

2》二維字首和:求乙個矩形內所有元素的和:

//dp[i][j]表示座標(i,j)到(1,1)的矩形元素的和

//a[i][j]表示座標(i,j)的元素

for(i=

1;i<=n;

++i)

//字首和

}for

(i=1

;i<=k;i++

)

可參考 這篇部落格

3》二維差分:

與一維差分類似

座標(x1,y1)為左上角,(x2,y2)為右下角的矩形

這裡以矩形內元素加q為例

for

(i=1

;i<=k;i++

)

4》浮點數二分運算:

const

double eps=

(此處的eps取值看下面)

bool

check

(double x)

double

dsearch

(double l,

double r)

else

}}

eps通常取10^-(k+2),此處的k是保留的位數

5》整數二分模板以及細節:

(1)將區間【l,r】分成【l,mid】和【mid+1,r】,其左右端點的更新為

r=mid和l=mid+1;此時的mid計算時不用+1;

例:在單調遞增序列中查詢第乙個**大於等於**x的數字中最小的乙個;

bool

check

(int x)

intsearch

(int l,

int r)

else

}return l;

}

(2)將區間【l,r】分成【l,mid-1】和【mid,r】,其左右端點的更新為r=mid-1和l=mid;防止進入死迴圈,計算mid時候要+1;

例在單調遞增序列中查詢第乙個小於等於x的數中最大的乙個

bool

check

(int x)

intsearch

(int l,

int r)

else

}return l;

}

對於(1)我們可以用lower_bound()和upper_bound()來實現

但是對於(2)我們就要用乙個不太熟悉的last_less()和last_less_equal()來實現;

此處強調一下區間內含負數的情況:

含有負數一定要用位運算,不用/2,因為/2是向0取整,而》1是向下取整;

-3>>1= -2 -3/2=-1;

這裡有篇部落格,把二分講的非常好

acm模板總結

模板鏈結 kmp exkmp trie 可持久化trie樹 dfs 序 01trie manacher 字串雜湊 2019上海網路賽 g題 17 sa 字尾陣列 最大不重疊相似子串 求兩個字串長度不小於 k 的公共子串的個數 sam 字尾自動機 洛谷p3975 求字典序第k小串 動態求出現至少k次本...

模板 ACM模板總結(目錄)

目錄 一.概述 個人預期 內容概述 時間安排 二.stl 標準模板庫 vector使用 string使用 stack使用 queue使用 map使用 algorithm使用 set使用 四.字串 string 五.圖論 graph 六.網路流 network 七.資料結構 structure 八.計...

ACM常見問題1

取模 取模運算n p的結果與p的符號無關,由n決定。例如 7 4 3,7 4 3,7 4 3,7 4 3 基本的運算 a b p a p b p p a b p a p b p p a b p a p b p p a b p a p b p 重要定理 a b p 對任意的c都有 a c b c p ...