50分求助

P1886 滑动窗口 /【模板】单调队列

MY(一名蒟蒻) @ 2020-08-25 11:46:36

code

样例过了,自己造了组数据

input:
15 6
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

输出了

0 0 0 0 0 0 0 0 0 0 
15 0 0 0 0 0 0 0 0 0 

自己找了一个上午的错,真的不知道错哪里。谢谢各位大佬!


by Eric_Xian @ 2020-08-25 11:55:15

前排


by JK_LOVER @ 2020-08-25 14:08:29

@MY(一名蒟蒻)||

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;
const int N=1e6+10;
int minl=1,minr,maxl=1,maxr,n,k,ans[2][N];
struct node {int t,num;};
node minq[N],maxq[N];
void push(int &head,int &tail,node q[],const node &x,const int f)
{
    if(f) while(head <= tail && x.num >= q[tail].num) tail--;
    else while(head <= tail && x.num <= q[tail].num) tail--;
    if(tail-k == head) head++;
    q[++tail].num=x.num;
    q[tail].t=x.t;
    while(head <= tail && q[tail].t-k >= q[head].t) head++;
    return ;
}
int main()
{
//  freopen("work.in","r",stdin);freopen("work.out","w",stdout);
    scanf("%d%d",&n,&k);
    node a;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a.num);
        a.t=i;
        push(minl,minr,minq,a,0);
        push(maxl,maxr,maxq,a,1);
        ans[0][i]=minq[minl].num;
        ans[1][i]=maxq[maxl].num;
    }
    for(int i=k;i<=n;i++) printf("%d ",ans[0][i]);
    puts("");
    for(int i=k;i<=n;i++) printf("%d ",ans[1][i]);
    return 0;
}

by JK_LOVER @ 2020-08-25 14:09:04

@MY(一名蒟蒻) ||数组下标,应该为 0,1


by MY(一名蒟蒻) @ 2020-08-25 14:16:39

@JK_LOVER 啊这,以后真是要好好注意一下了


by MY(一名蒟蒻) @ 2020-08-25 14:19:36

@JK_LOVER 谢谢!


|