STL:
在队尾删除,在队尾进队
#include<iostream>
#include<deque>
using namespace std;
const int maxn=1000000+10;
int a[maxn],b[maxn],c[maxn];
int main() {
ios::sync_with_stdio(false);
int i,n,k;
deque<int>q1,q2;
cin>>n>>k;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
{
while(!q1.empty()&&a[i]>a[q1.back()])
q1.pop_back(); //进来一个数之前比这个数大数都没有了
while(!q2.empty()&&a[i]<a[q2.back()]) q2.pop_back();
while(!q1.empty()&&q1.front()<i-k+1) q1.pop_front(); //最后一个出列
while(!q2.empty()&&q2.front()<i-k+1) q2.pop_front();
q1.push_back(i); q2.push_back(i);
b[i]=a[q1.front()]; c[i]=a[q2.front()];
}
for(i=k;i<=n;i++) cout<<c[i]<<(i==n?'\n':' ');
for(i=k;i<=n;i++) cout<<b[i]<<(i==n?'\n':' ');
return 0; }
数组模拟:
- #include<iostream>
- using namespace std;
- const int maxn=1000000+10;
- int a[maxn],b[maxn],c[maxn],q1[maxn],q2[maxn];
- int main()
- {
- ios::sync_with_stdio(false);
- int i,n,k;
- cin>>n>>k;
- for(i=1;i<=n;i++) cin>>a[i];
- int h1,h2,r1,r2;h1=h2=r1=r2=0;
- for(i=1;i<=n;i++)
- {
- while(h1<=r1&&a[i]>a[q1[r1]]) r1--;
- while(h2<=r2&&a[i]<a[q2[r2]]) r2--;
- while(h1<=r1&&q1[h1]<i-k+1) h1++;
- while(h2<=r2&&q2[h2]<i-k+1) h2++;
- q1[++r1]=q2[++r2]=i;
- b[i]=a[q1[h1]];c[i]=a[q2[h2]];
- }
- for(i=k;i<=n;i++) cout<<c[i]<<(i==n?'\n':' ');
- for(i=k;i<=n;i++) cout<<b[i]<<(i==n?'\n':' ');
- return 0;
- }