求助单调队列优化DP
查看原帖
求助单调队列优化DP
372299
超级玛丽王子楼主2020/10/9 18:04

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;
}
2020/10/9 18:04
加载中...