いくつかのナンセンス:
記念ヒンずっと前gellygoat首長がキューの単調さをオフに移動した後、決して巣に私たちに語りました
9S一度コンピュータコンパイルqbxt +ヒトデあり
素敵でf10キー
データは、ツリーラインカードに目を通すことができますか?
この質問はもちろんのモノトーンボードキューの問題で、単調なキューです
ここでは、あまりにも、私たちは2つのモノトーンキューを設定(dalaoは1ですが、私はdalaoないよ、2つだけ)
それは単調なキューであるので、要素内のキューが単調でなければなりません。しかし、注意しない単調キュープライオリティキューも
実際にモノトーンキュー両端キュー
最初のステッカーは、共通の機能を両端キュー
挿入:
チームのヘッドから挿入:q.push_front();
尾から挿入:q.push_back();
キューの前に要素のXダブルエンドインサート要素:イテレータが挿入(イテレータit、のconst T&x)は、
(それをイテレータ、整数nは、CONST T&X)ボイドインサート:両端キューnは同一の要素は、要素Xの前に増加します
削除:
要素のチームヘッドの削除:q.pop_front()
チームの最後の削除要素:q.pop_back()
キューが空である:q.clear()
要素を削除するには、次のイテレータの消去を(それをイテレータ)
より多くの使用を参照してくださいここに
例えば、キューが良いの最小値を維持してください
当社の保守チームは、最小範囲の現在のヘッドです。
現在のインデックスは、現在キューの最初の数(スライダー現在の左端)よりも小さい場合は、それが引退し、オフポップ(空でないキューのことに注意してください)することを示しています
我々は尾から新しい番号を挿入します。[X](の数を挿入するために)大きい場合、尾のこの時間添え字番号[x]は、以前無効よりも、より尾比X現在の数よりも小さくなければなりません。この光の中で見ると、チームの現在の数は、候補者の最小数の終わりにはできませんので、私たちが飛び出し、それを呼び出します
上記の二つのポップ後、それが[X]の尾部にあってもよいです
どのようなコードのバーの詳細を参照してください。
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<queue> #include<stack> #include<set> #include<map> #include<vector> using namespace std; inline int read() { char ch=getchar(); int x=0;bool f=0; while(ch<'0'||ch>'9') { if(ch=='-')f=1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return f?-x:x; } int now,n,k,a[1000009],mi[1000009],ma[1000009],cnt; struct dl{ int xb,zhi;//队列是结构体类型,记录下标和数的值 dl(int xx,int yy):xb(xx),zhi(yy){}//构造函数 }; deque<dl> qma,qmi;//qma维护最大值,qmi维护最小值 void pshmax(int x) { while(!qma.empty()&&qma.front().xb<now) qma.pop_front();//注意队列非空(RE警告) while(!qma.empty()&&qma.back().zhi<a[x])qma.pop_back(); qma.push_back(dl(x,a[x])); } void pshmin(int x) { while(!qmi.empty()&&qmi.front().xb<now) qmi.pop_front(); while(!qmi.empty()&&qmi.back().zhi>a[x])qmi.pop_back(); qmi.push_back(dl(x,a[x])); } void luangao() { for(now=2;now+k-1<=n;now++)//加的是k-1啊k-1 { pshmin(now+k-1);pshmax(now+k-1); mi[++cnt]=qmi.front().zhi; ma[cnt]=qma.front().zhi; } } int main() { n=read();k=read(); for(int i=1;i<=n;i++) a[i]=read(); qma.push_back(dl(1,a[1])); qmi.push_back(dl(1,a[1])); for(int i=2;i<=k;i++)//先手动处理[1,k]这个区间 { pshmax(i); pshmin(i); } ma[1]=qma.front().zhi; mi[1]=qmi.front().zhi; cnt=1; luangao(); for(int i=1;i<=cnt;i++) printf("%d ",mi[i]); printf("\n"); for(int i=1;i<=cnt;i++) printf("%d ",ma[i]); }