HDU3415單調隊列

來源:互聯網
上載者:User

這題是單調隊列的典型運用。

 

至於單調隊列,就是一個雙端隊列,在隊首(f)出隊,在隊尾(b)出隊入隊,我們要維護整個隊列的元素是單調的,比如,我們要動態查詢從左向右的區間的最小值,那麼我們就要在隊列中維護一個單調遞增的序列,從左向右枚舉,隊列的元素還有一個id值,代表這個元素在原序列中的位置,然後左邊的元素如果不在範圍內了,就判斷隊首的元素id是否是這個左邊的id,是的話就出隊,否則就不管。關於元素入隊,首先判斷入隊的元素是否大於隊尾的元素(保證隊列單調遞增),如果不大於,那麼彈出隊尾元素,直到隊尾元素小於入隊元素或者隊列為空白。

 

枚舉sum[i]表示前i個元素的和,注意這裡為了實現迴圈的序列要將n擴充到2*n。
然後枚舉每一個sum[i],找到i之前k個元素[i-k,j]區間內的sum最小值sum[k],sum[i]-sum[k]就是最優解,然後取全域最優解即可。
注意一點在隊列中在處理隊列之前就要先將i-k-1號元素刪除,我們要在隊列維護最多k+1個元素,然後去最值,最後才將sum[i]入隊。
複雜度O(n)。

 

My Code:

#include <cstdio><br />#include <cstdlib><br />#include <cstring><br />#include <algorithm><br />using namespace std;<br />const int MAX=200010;<br />const int oo=0x3f3f3f3f;<br />int q[MAX],val[MAX],id[MAX],f,b;<br />int main(){<br />int t,n,k;<br />freopen("in.txt","r",stdin);<br />scanf("%d",&t);<br />while(t--){<br />scanf("%d%d",&n,&k);<br />for(int i=0;i<n;i++){<br />scanf("%d",&val[i]);<br />val[i+n]=val[i];<br />}<br />n*=2;<br />for(int i=1;i<n;i++){<br />val[i]+=val[i-1];<br />}<br />f=b=0;<br />int ret=-oo,st,ed;<br />for(int i=0;i<n;i++){<br />if(f!=b&&id[f]==i-k-1)f++;<br />if(i<k&&ret<val[i]){<br />ret=val[i];<br />st=1;<br />ed=i%(n/2)+1;<br />}<br />if(f==b){<br />if(i&&ret<val[i]-val[i-1]){<br />ret=val[i]-val[i-1];<br />st=i%(n/2)+1;<br />ed=i%(n/2)+1;<br />}else if(ret<val[i]){<br />ret=val[i];<br />st=ed=i%(n/2)+1;<br />}<br />}else{<br />if(ret<val[i]-val[id[f]]){<br />ret=val[i]-val[id[f]];<br />st=(id[f]+1)%n+1;<br />ed=i%(n/2)+1;<br />}<br />}<br />while(f!=b&&q[b-1]>val[i])b--;<br />id[b]=i;<br />q[b++]=val[i];<br />}<br />printf("%d %d %d/n",ret,st,ed);<br />}</p><p>return 0;<br />}<br />

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.