指使用stl庫的priority_queue進行模擬,優點在於實現簡單。可用於求區間最值,由於使用堆操作,時間複雜度在\([n\log_2~n^2\log_2]\),當資料較大時容易tle
單調佇列使用stl的deque進行模擬,也可以用陣列和雙指標\((head,tail)\),有兩種操作,刪頭和去尾,實現乙個區間內單調增或減的佇列,線性複雜度。單調佇列經常與dp一起優化。
判斷頭元素是否過期——超過視窗長度,過期即彈出;
判斷尾元素是否大於新元素(遞減),小於新元素(遞增)。原理是若尾元素若不滿足條件,則尾元素一定不可能移動到頭元素,因此可以彈出;
對一定範圍內的dp陣列進行單調佇列維護,目的在於取一定範圍內的dp最值,而不僅僅是前乙個
轉移方程一般為 \(dp[i]=dp[j]+w[i],(j+m
經典題:
洛谷p1440 求m區間內的最小值
經典st表,mle。需要的二維陣列範圍太大,超過記憶體限制,速度也比較慢
#include#define for(i,a,b) for(int i=a;i優化記憶體st表,tle,使用一層陣列重複計算值,解決了記憶體的問題,但是st表迭代計算速度慢的劣勢導致tle
#include#define for(i,a,b) for(int i=a;i優先佇列,550ms過,但是根堆的調整速度還是略慢
#include#define for(i,a,b) for(int i=a;i=n2.val; //小根堆
}};priority_queue,cmp>q;
int main()
}return 0;
}
洛谷p1886 滑動視窗
優先佇列,根堆調整複雜度\(o(n\log_2)\)的劣勢導致根本過不了第二個點,直接tle
#include#define for(i,a,b) for(int i=a;i=n2.val;
}};struct cmp2
};priority_queue,cmp>q;//小根堆
priority_queue,cmp2>q2;//大根堆
int ansx[maxn];
int ansn[maxn];
int n,k;
int main()
} for(i,0,n-k+1)printf("%d ",ansn[i]);
printf("\n");
for(i,0,n-k+1)printf("%d ",ansx[i]);
return 0;
}
單調佇列,550ms過,線性複雜度nb
#include#define for(i,a,b) for(int i=a;iq1;//遞減
dequeq2;//遞增
int ansx[maxn],ansn[maxn];
int n,m;
int main()
;q.push_back(dp[0]);
for2(i,1,n)
ll ans=inf;
for2(i,n-m+1,n)
printf("%d\n",ans);
return 0;
}
附使用陣列和指標的手動單調佇列,速度快20ms
#include #include #include #includeusing namespace std;
int n,m;
int w[100001];
int que[100001],head=0,tail=0;
int f[100001];
int main()
for(int i=0;i<=n;i++)
{cout《其他題目:
洛谷:p3957 跳房子
p2216 [haoi2007]理想的正方形
p1725琪露諾
p1714切蛋糕
【tyvj1305】最大最大子序和
【vijos1243】生產產品
【hdu3530】subsequence
【hdu3401】subsequence
【poj1742】coins
[【hdu4374】 one hundred layer]
【codeforces372c】 watching fireworks is fun
參考部落格
單調佇列 優先佇列
dequeue int que 建立雙向佇列 que.push front 在佇列前面塞乙個元素 que.push back 在佇列後面塞乙個元素 que.pop front 刪除佇列第乙個元素 que.pop back 刪除佇列的最後乙個元素 que.clear 清空佇列 que.empty 判斷...
單調佇列 優先佇列
如果乙個人比你年輕還比你強,那你就要被踢出去了 單調佇列 來來來,神犇巨佬 金牌 au 爺 aker 站在最上面,蒟蒻都靠下站!優先佇列 顧名思義,所謂單調佇列,那麼其中的元素從隊頭到隊尾一定要具有單調性 單調公升 單調降等 它被廣泛地用於 滑動視窗 這一類 rmq 問題,其功能是 o n 維護整個...
專題 單調佇列
單調佇列就是佇列中元素滿足單調性 入隊 從隊尾入隊,在入隊的時候刪掉隊尾比當前入隊的元素大 或小 的元素 出隊 出隊是直接把隊頭元素取出 poj2823 sliding window 滑動視窗 給定乙個長為n陣列以及乙個長為k的滑動視窗,視窗每個時刻向後移動一位,求出每個時刻視窗中數字的最大值和最小...