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