原创 數據結構——線段樹

線段樹(一種二叉搜索樹) 樹形結構的特點讓它更方便查詢搜索。 線段樹方便與對區間查詢,區間更新維護,這是因爲樹上的父親節點表示了一段區間。葉子結點纔是原始的元素。 如上圖所示: 利用線段樹解決問題的步驟如下(以模版題——給N個

原创 滑動窗口,單調隊列

牛客滑動窗口 算法思想: 利用雙端隊列(deque)維護一個單調隊列,再利用滑動區間遍歷就可以了; #include <bits/stdc++.h> using namespace std; const int N=1e6+66;

原创 最小生成樹prim(優先隊列優化)算法+Kruskal算法

最小生成樹 1.prim算法 算法思想:從任意一點出發,記錄點的最小權值,每一次將最小邊的結點標記一下,直到所有的點都被加到樹裏面。優先隊列將邊按從小到大的順序排列,隊首爲最小的邊。 板子題:HUD-1863 #include <

原创 莫比烏斯反演+整除分塊

莫比烏斯反演: 若: F(n)=∑d|n {f(d)} 則: f(n)=∑d|n {μ(d)*F(⌊n/d⌋)} 或者是: 若: F(n)=∑n|d {f(d)} 則: f(n)=∑n|d {μ(d/n)F(d)} 兩種情況。 題

原创 迴文串——馬拉車(模板)

N - 最長迴文 給出一個只由小寫英文字符a,b,c…y,z組成的字符串S,求S中最長迴文串的長度. 迴文就是正反讀都是一樣的字符串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入

原创 gcd(最大公約數)

gcd(a,b)=gcd(b,a%b) 假設a>b; #include <iostream> #include <algorithm> #include <cstdio> using namespace std; int gcd(

原创 Codeforces Round #641(Div 2)

A. Orac and Factors 題目描述:For n≥2, we will denote as f(n) the smallest positive divisor of n, except 1.定義f(n) 爲n的最小因

原创 CF_Constant Palindrome Sum(差分維護區間和)

題目傳送門 這道題需要轉化成區間問題:對於任意一對(a[i],a[n-i+1]),當假定和X在(min(a[i],a[n-i+1)+1,max(a[i],a[n-i+1])+k)裏面時只需改變一個數,+1,特殊的x=a[i]+a[

原创 懸線dp(HDU1505)

HDU 1505 算法思想:對於每一點面積=up[i][j]*(r[j]-l[j]+1); 算法步驟: 1.統計每一層的最高長度up[][]; 2.利用up[][]維護r[]數組和l[]數組; #include <bits/std

原创 最小費用最大流(板子)

最小費用最大流 步驟: 1.spfa()找最小費用的路徑,並記錄; 2.利用最大流維護路徑; 模板題:洛谷P3381 #include <bits/stdc++.h> using namespace std; const int

原创 帶權二分圖最優匹配KM算法

KM 算法思想 設有A[],B[]二分圖,貪心的去找與A[i]的最大匹配,若沒有找到就增加邊,直到找到最優爲止; 實現步驟 1.初始化l[],r[],數組,設置頂標,即找到與A[i]最大匹配的B[],存在l[]數組中,r[]數組初

原创 最大流dinic(模板)

最大流(Dinic) 算法思想 1.bfs()從起始節點開始找到點的深度,以離s起點最近爲標準; 2.dfs()找流量正向減去多少,反向加上多少; 例題 洛谷P3376 * 代碼 #include <bits/stdc++.

原创 帶權並查集(模板)

帶權並查集 算法思想:維護節點到前導節點的距離; HDU3047 #include <bits/stdc++.h> using namespace std; const int N=54321; int dis[N],pre[N]

原创 掃描線板子題

Picture A number of rectangular posters, photographs and other pictures of the same shape are pasted on a wall. The

原创 最小生成樹——模板

題目 模版題很簡單; 一共有n個城市(從1開始編號),有m條路線,求出一條能連通n個城市的最小路線; 分析 首先需要找到一條能連通所有城市的路線; 其次要保證這條路徑的路程最短; 算法簡介 常用兩種算法: Kruskal 時