原创 最小生成樹模板

struct edge{ int u,v,cost; }es[maxn_e]; bool cmp(const edge &a,const edge &b){ return a.cost<b.cost; } int par

原创 並查集

並查集用來管理 相互關聯的元素的分組情況,但只能進行合併,不能分割: 查詢a,b是否在同一組 合併a,b所在的組 int father[maxn];//記錄父親節點 int rank[maxn];//數的高度 初始爲0 void in

原创 二分模板

//left-right組成的空間內是不符合要求的範圍 int binary(){ int left=1,right=pos[n-1]-pos[0]; int mid; while(right>left){

原创 巧算星期幾(蔡勒公式)

蔡勒公式 W=[C/4]-2C+y+[y/4]+[26(m+1)/10]+d-1 (其中[ ]爲取整符號) 其中,W是所求日期的星期數.如果求得的數大於7,可以減去7的倍數,直到餘數小於7爲止.c是公元年份的前兩位數字,y是已知公元年

原创 區間最值查詢(RMQ)

ST算法 預處理第i位起連續2^k個數的最大值,快速查詢。 說明:定義數組dp[i][j]表示 從第i位起連續2^j個數 的最大值。 (區間內有2^j個數) 例子: 2 5 9 6 3 1 dp[1][2] 第1位起連續2^2(

原创 徘徊在WA和tel的模擬退火

模擬退火 模擬降溫的過程:溫度越高時溫度下降越多,溫度越低(穩定)時,溫度下降越少 首先由爬山算法開始 爬山算法:即完完全全的貪心算法,只找到眼前的山峯最高值。 但從c點開始時,我們發現找到的A點不是全局最優解,這也是貪心的缺點。

原创 最短哈密頓迴路(旅行商問題)

哈密頓迴路:不重複地經過每個點,並最終能回到起始點的迴路 有別於歐拉回路:不重複經過每條邊的迴路 哈密頓迴路是點遍歷 旅行商問題:求一條經過圖中所有點且邊權和最小的迴路。 以下解法: 模擬退火 狀壓dp dfs

原创 割點與橋與縮點(tarjan)

割點:若刪除該點,圖不連通,則該點爲割點 橋:若刪除該邊,圖不連通,則該邊爲橋 如何求割點: Tarjan算法,一次dfs遍歷: 對每個點,記錄dfs序爲dfn[],low值爲low[](low初始值與dfn相同) 回溯時,如果回

原创 線段樹模板

struct node{ int l,r; ll sum,lazy; }tree[maxn * 4]; // 開四倍大小 void push_up(int root){ tree[root].sum = tree[roo

原创 歐幾里得算法及其擴展

歐幾里得算法 求最大公約數GCD: 輾轉相除引理: 設數a,b(a>b),可得: gcd(a,b)=gcd(b,a%b) 證明: 設 c=gcd(a,b) 可得 a=xc, b=yc (x,y互質) 又a%b=a-(a/b)

原创 迴文子串

//manacher算法 /*獲得字符串最長迴文串(長度,位置)*/ #define Maxn 1000 struct Manacher{ string str;//輸入的字符串 int RL[Maxn];//迴文半徑數組(表示以第i個字

原创 計算幾何之判斷線段相交

兩條線段可以看作是兩個向量; 一條線段跨立另一條線段的條件是:一條線段的端點分別到另一條線段兩個端點構成的向量在該線段兩側;(可能不相交) 而兩條線段互相跨立,即相交,就可判斷。 模板分享 #include <iostream>

原创 大數模板

#include<iostream> #include<string> #include<iomanip> #include<algorithm> using namespace std; #define MAXN 9999

原创 中國剩餘定理(互質與不互質)

其實,不管互質還是不互質都是求解線性同餘式: 中國剩餘定理(互質)是求解線性同餘式的一種特殊形式; 兩種情況都是把多個方程組轉成一個方程求解。 中國剩餘定理模板(互質): void exgcd(ll a,ll b,ll &d,ll &