原创 洛谷p1387最大正方形

原題 用搜索最壞情況小於1e10,一般不會超時。 這裏需要一個技巧,f[i][j]表示在i,j點的最大正方形邊長,通過畫圖推導出轉移方程。 #include<iostream> #include<cstdio> #include<cstr

原创 洛谷p1108低價購買

原題 首先可以分析出來要求單調下降子序列,那麼下一步需要求滿足最長的數量且不能重複,那麼思考一下,能不能在求出最長序列的同時求出滿足此長度不相同的序列呢? (這種類型題和子字符串匹配比較類似,也是個人認爲noip範圍內最難的一種線性dp)

原创 洛谷p1880石子合併

原題 每次合併相鄰的石子,用搜索比較耗時,想想dp可不可以。 合併後的石子不會產生後效性,那麼假設有兩堆已經是最優的石子堆,合併它們的代價就是其石子數之和, 合併出來的一定是最優解,而你的目標是將所有石子合併成一堆,但問題是不知道其中最優

原创 10.24日記

  今天早上把昨天沒編譯成功的題給A了,cf961D,是一道主席樹的題,四種操作,每一種操作需要一天,分別是加入重要度爲xi的ai任務,刪除ai任務,查詢重要度比ai小的數量,取消之前x天的操作,xi的範圍屬於1e9,我們發現查詢只需要一

原创 樹鏈剖分入門詳解

先拋出一個問題,一棵n個點的樹,每個點有一個不變的權值,m次詢問任意兩點之間的權值和。 最簡單的算法:m次循環,每次從一個點出發,dfs累計走過的路徑,直到到達另外一個點。 int dfs(int x,int fa,long long

原创 洛谷p1816忠誠

原題 區間查詢最小值,數據1e5,nlogn算法,聯想到RMQ算法,f[i][j]表示i點後2<<j位中最小值,dp枚舉即可。 #include<iostream> #include<cstdio> #include<cstring>

原创 洛谷p1908逆序對

原題 這裏有一個樹狀數組的做法,先離散化,由小到大排序,每枚舉到一個點,就加入樹狀數組,然後計算之前比他大的值,加入ans。 #include<iostream> #include<iomanip> #include<cstdio> #

原创 洛谷p1970花匠

原題 一共兩種情況,分別畫圖模擬一下就可以很快想出思路,線性dp分情況討論 ,波峯與波谷交替出現,比如現在正在求f[i],那麼尋找i之前比他矮(那麼他就是波峯)或比他高(他是波谷),取最大值存入,並且記錄他是波谷還是波峯。 代碼不難實現,

原创 洛谷p3800power收集

原題 一道很不錯的優先隊列題 f[i][j]的最大值由上一行的狀態有關,轉移方程f[i][j]=max(f[i-1][z])+a[i][j],z∈(j-k,j+k) 每個轉移會超時,所以我們對上一行建立單調隊列,由1推到m,提前入隊,超出

原创 洛谷p1052過河

原題 先想一下思路,由於是區間跳躍,不能用貪心,那麼f[i]表示跳到i時最少踩到的石子數,i只能由i-t~i-s轉移過來,所以選擇其中的最小值跳,保證f[i]最小。 但是l太大了,1e9,但是m和t很小,就是1e9中有很多沒有用的空間,我

原创 洛谷p1496火燒赤壁

原題 排着找就行了,但是範圍太大,需要離散化一下,左端點由小到大排序,然後每個進行判斷。 另外結構體習慣用stablesort。 #include<iostream> #include<cstdio> #include<cstring>

原创 快速冪模板c++

原題 #include<iostream> #include<iomanip> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using n

原创 c++最近公共祖先LCA(倍增算法和tarjan)

1.倍增 找兩個點的LCA,先讓它們深度相同,然後倍增向上跳躍,跳到使他們的值不相同的最淺層的點,那麼此點的上方即是LCA。 #include<iostream> #include<iomanip> #include<cstdio> #

原创 洛谷p1455搭配購買

原題 沒有搭配就是一道裸01揹包,搭配的話用並查集並一併,結束後只取他們的祖先加入揹包計算。 #include<iomanip> #include<cstdio> #include<cstring> #include<iostream>

原创 c++樹狀數組2模板

原題 區間修改,單點求值,那麼都需要logn的複雜度,將修改的效果添加到大節點上,向下遍歷樹,這樣最後求單點時向上遍歷樹。 #include<iostream> #include<cstdio> #include<cstring> #i