求助单调队列优化DP

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

超级玛丽王子 @ 2020-10-09 18:04:25

RT,用单调队列优化DP求解,然而莫名TLE,不知为何。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1000005;
int a[maxn],q[maxn],num[maxn]={0};
int Fmax[maxn],Fmin[maxn];
int i,k,n,head,tail;
int Read() {
    scanf("%lld%lld",&n,&k);
    for(i=1;i<=n;i++) scanf("%lld",a+i);
}
void DPmin() {
    head=1,tail=0;
    for(i=1;i<=n;i++) {
        while(num[head]<i-k+1&&head<=tail) head++;
        while(a[i]<=q[tail]&&head<=tail) tail--;
        num[++tail]=i,q[tail]=a[i];
        Fmin[i]=q[head];
    }
}
void DPmax() {
    head=1,tail=0;
    for(i=1;i<=n;i++) {
        while(num[head]<i-k+1&&head<=tail) head++;
        while(a[i]>=q[tail]&&head<=tail) tail--;
        num[++tail]=i,q[tail]=a[i];
        Fmax[i]=q[head];
    }
}
signed main(void) {
    Read();
    DPmin();
    DPmax();
    for(i=k;i<=n;i++) printf("%lld ",Fmin[i]);putchar('\n');
    for(i=k;i<=n;i++) printf("%lld ",Fmax[i]);putchar('\n');
    return 0;
}

by 超级玛丽王子 @ 2020-10-09 18:10:35

欧布 DPmax 应该将q重置,但是仍然TLE


by Rui_R @ 2020-10-09 18:20:54

@我爱Chtholly Read函数没有返回值,然后就死掉了。


by Rui_R @ 2020-10-09 18:21:38

不用将q重置


by 超级玛丽王子 @ 2020-10-09 18:23:23

@Rui_R aaa原来如此!


|