分治,即分而治之,將大問題分解為小問題,分別求解,最後合併結果。許多演算法都是建立在分治的基礎上的,比如說快速排序,歸併排序等
例題1:南蠻圖騰
不難發現每個圖案是由許多這個圖案組成的:
然後就可以用分治來遞迴解決本題,別忘了處理空格喲/\
/__\
**:
例題8:【模板】快速冪||取餘運算#include using namespace std;
int n;
string ans[1500];
void sum(int x)
inline void qsort(int a,int l,int r)
else s[a[j+1]]++,ss[++ss[0]]=a[j+1],ww[++ww[0]]=a[j];
merge(); //歸併
}
cout《例題7:冪次方
直接無腦遞迴,先算出\(2^?\)最接近\(n\)但是比\(n\)小
然後把\(n\)減去這個數變成新的\(n\)
重複這兩個步驟即可
#includeusing namespace std;
int n;
inline void solve(int x)
}int main()
這個題的思想把這個要求的冪次換成二進位制(口胡)
核心**
例題9:黑白棋子的移動ll fastpow(ll x,ll y,ll mod)
return qwq%mod;
}
這道題目前面幾個還是很好找規律的
就是把中間的"o*"的丟到最右邊,再把"__"丟到最左邊的'*'的左邊
打表發現後6個字元一定是"o*o*o*"
**:
#include using namespace std;
int n;
char ch[205];
void print()
void move(int s, int e)
string out[4]=;//表
int main()2^p\)=\(p*log_(2)\)
\(10^\)的位數為\(n\)+\(1\)
所以\(2^p\)位數為\(p\)*\(log_(2)\)+\(1\)
第二個問題就是高精度乘法壓位運算
**不難得出:
#includeusing namespace std;
typedef long long ll;
const ll ea=100000;//%%%ea
int a[101]=;
int main()
for(int i=1;i<=l;++i)
--a[0];
for(int i=99;i>-1;--i)
}
CDQ分治學習筆記
今天學了一下cdq分治,感覺這東西真的挺好用的,趕緊寫點東西怕以後再忘咯 其實類似於cdq分治的東西在oi早期學排序的時候就應該學過,那就是歸併排序 歸併排序的原理和cdq分治大體一樣,先劃分成兩個區間,遞迴解決兩邊,再合併起來 並且用歸併排序求逆序對的時候本質上就是在解決乙個二維偏序的問題 首先回...
點分治學習筆記
點分治主要用來處理樹上路徑問題,可以統計樹上點到點的所有路徑,複雜度o nlogn 基於樹上的結點進行分治,不斷將一棵樹拆成多顆子樹處理 選擇點時為了防止退化成鏈的情況,如果選點後左右子樹越大,遞迴層數越多,時間越慢,反之則越快,我們每次選擇子樹內的重心 void getroot int u,int...
CDQ分治 學習筆記
對於每個 查詢 操作,其結果ans i 1,i 1 ans i 1,i 1 ans i 1,i 1 中所有修改對其造成影響的疊加 這裡的 疊加 需要能夠比較方便的維護,例如sum min max sum min max sum mi n ma x等 定義s ol ve l r solve l,r s...