P1886 滑动窗口 /【模板】单调队列 set的应用题解
P1886 滑动窗口 /【模板】单调队列
//60分 #includeusing namespace std; vector Maxv,Minv; struct Maxnode { int val; int i; bool operator <(const Maxnode &n)const { if (val>n.val) return true; else return i Maxset; int main() { int n,k; Maxnode Mx; set ::iterator Mxit,Miit; scanf("%d %d",&n,&k); for (int i=1;i<=k;i++) { int x; scanf("%d",&x); Mx.val=x; Mx.i=i; Maxset.insert(Mx); } for (int i=k+1;i<=n;i++) { int x; Mxit=Maxset.begin(); while(i-(Mxit->i)>k) { Maxset.erase(Mxit); Mxit=Maxset.begin(); } Maxv.push_back(Mxit->val); Miit=Maxset.end(); Miit--; while(i-(Miit->i)>k) { Maxset.erase(Miit); Miit=Maxset.end(); Miit--; } Minv.push_back(Miit->val); scanf("%d",&x); Mx.val=x; Mx.i=i; Maxset.insert(Mx); } Mxit=Maxset.begin(); while(n+1-(Mxit->i)>k) { Maxset.erase(Mxit); Mxit=Maxset.begin(); } Maxv.push_back(Mxit->val); Miit=Maxset.end(); Miit--; while(n+1-(Miit->i)>k) { Maxset.erase(Miit); Miit=Maxset.end(); Miit--; } Minv.push_back(Miit->val); for (int i=0;i