超级玛丽王子 @ 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原来如此!