当前位置: 代码迷 >> 综合 >> poj 2823 滑动窗口 经典单调队列
  详细解决方案

poj 2823 滑动窗口 经典单调队列

热度:8   发布时间:2023-11-06 17:40:48.0

不知道为什么交G++的话,用printf反而比cout慢,而且就是慢了这零点几秒,刚好超时,我改了半天的代码,最后才找出是输出超时,还有一个解决的方法就是交c++。

#include<iostream>
#include<cstdio>using namespace std;const int mx = 1e6+10;
int p[mx],qmax[mx],qmin[mx],ansmax[mx],ansmin[mx];
int n,k;//queue<int>q1,q2;
int main(){//int T=10;while(scanf("%d%d",&n,&k) != EOF){for(int i = 0; i < n; i++)scanf("%d",p+i);     int tail=0,head=0;int tail2 = 0,head2 = 0;for(int i = 0; i < n; i++){   if(tail > head && i - qmax[head]  >= k )   //队首处理 head++;if(tail2 > head2 && i - qmin[head2]  >= k )   //队首处理   长度应当+1 head2++;while(tail > head && p[i] >= p[qmax[tail-1]])      //队尾处理 tail--;while(tail2 > head2 && p[i] <= p[qmin[tail2-1]])tail2--;qmax[tail++] = i;qmin[tail2++] = i;	ansmax[i] = p[qmax[head]];ansmin[i] = p[qmin[head2]];}for(int i = k - 1; i < n; i++)printf("%d ",ansmin[i]);puts("");for(int i = k - 1; i < n; i++)printf("%d ",ansmax[i]);puts("");}return 0;
}