單調佇列專題總結

2021-09-16 21:16:47 字數 2602 閱讀 7966

1、hdu - 4193

題意:

n個數組成的序列環,求長度小於等於m的字串的最大區間和。

思路:如果n個數為線性關係,可以用單調佇列維護第i個數之前的m個數,

及時剔除沒用的數。o(n)解決。

這裡是環,2倍陣列破環成鏈即可。(**非自己寫)

#include#include#includeusing namespace std;

#define maxn 1000005

int n,m,head,rear,ans;

int a[maxn*2],q[maxn*2];

void in_queue(int x)

void out_queue(int x)

printf("%d\n",ans);

}}

2、hdu - 3474

題意:

由字母c和j組成的序列環,可以從任意乙個地方斷開,

要求斷開後向右或者向左便利序列的過程中保持number c>=j,

求滿足要求的切割方案數。

思路:

暴力:破環成鏈,列舉終點(或者中點起點都可以),看終點往前的n個數是否滿足要求。o(n*n);

思考:n個數滿足要求即n個數所有以第乙個數為起點的字串和均》=0,或者說其中

最小字首和-第乙個數-1的字首和》=0,所以問題變為求以第i個數為起點,長度最

長為n的的字串中最小 的字首和。

也可以轉換為求以第i個數為末尾,長度不超過n的字串中最小的字首和。只要

起點到該點的序列和》=0 ,則段序列對應的切割點為可行方案。(ps:最開使看的

模板題也是求以第i個數為終點,長度不超過m的字串中最小的/最大的字首和,(

用單調佇列來維護乙個長度小於m的序列,該序列只在隊頭和隊尾修改)所以這

題其實是模板的乙個變式,如果直接從原理上思考的話不太好考慮)。

#include#define ll long long

#define inf 0x3f3f3f3f

using namespace std;

const int maxn=2e6+50;

int n,m,k;

int tail,head;

int stk[maxn];

int ans;

int a[maxn];

int c[maxn];

char s[maxn];

bool jd[maxn];

int main()

c[0]=0;

for(int i=1;i<=2*n;i++)

ans=0;

head=-1;tail=0;

for(int i=1;i<2*n;i++)

c[0]=0;

for(int i=1;i<=2*n;i++)

head=-1;tail=0;

for(int i=1;i<=2*n;i++)// i<=2*n

for(int i=1;i<=n;i++)

if(jd[i]) ans++;

printf("case %d: %d\n",cas++,ans);

}return 0;

}

3、hdu - 3530

題意:n個數,求最長 字串 的長度,且該字串滿足

思路: 

暴力:列舉所有子串,計算最大值最小值,o(n*n*n)/,雖然線段樹不會,不過線段樹優化的話也是o(n*n*logn)。

本質是求子串的最值,所以目前來說有o(n)的單調佇列解法。所以考慮開兩個佇列,

乙個遞增、乙個遞減,兩者取隊頭座標小者作為左邊界,i是右邊界。當maxs-mini小於m時

用麼,調整後原來的對頭不照樣被區間包含。然後更新ans即可,ans=max(ans,i-l+1+1)

(理想狀態下len=不合法的len-1,不行的時候len'不再是len-2,要根據此時的l確定)。

#include#include#include#includeusing namespace std;

const int maxn=100010;

int q1[maxn],q2[maxn];

int rear1,head1;

int rear2,head2;

int a[maxn];

int main()

;struct nodeorder[max],q[max*4];//q表示單調遞增佇列

int mon(char *m)

bool leapyear(int &year)

int time(int &year,int mon,int &d,int &h);

node que[n];

void add_max(int num,int id)

int get_num(int id)

{ while(headthe end;

專題 單調佇列

單調佇列就是佇列中元素滿足單調性 入隊 從隊尾入隊,在入隊的時候刪掉隊尾比當前入隊的元素大 或小 的元素 出隊 出隊是直接把隊頭元素取出 poj2823 sliding window 滑動視窗 給定乙個長為n陣列以及乙個長為k的滑動視窗,視窗每個時刻向後移動一位,求出每個時刻視窗中數字的最大值和最小...

單調佇列優化專題

poj1821 這題是一道比較典型的佇列優化問題吧,狀態方程如下 dp i j max max,dp i 1 j dp i j 1 第i個人不刷,第i個人刷 第j面牆不刷,列舉所有可能結尾的牆 dp i j 表示前i個人刷前j面牆的最大值,且第j面牆必須刷。這題第一用到了雙端佇列deque,學習了不...

單調佇列,棧專題

a題 hdu 1506 題目大意 給你n個點,每乙個點代表當前座標下的矩形的高度,然後問你最大的矩形面積。具體思路 我們可以用乙個棧維護最大值,這個棧內的元素都是保持單調的,如果當前輸入的數比棧頂元素小的話,這個時候我們先算一波棧裡面的最大值,判斷停止的時候是當棧頂元素比當前輸入的元素小的時候停就可...