为什么要把 fi 初始化为 0xcf 呢?
Subteck2 全错代码:
#include <bits/stdc++.h>
using namespace std;
int n, l, r, ans = -10000000;
int a[200001], f[200001];
int q[200001]; //优先队列
int main()
{
cin >> n >> l >> r;
for(int i = 0; i <= n; i++)
cin >> a[i];
//memset(f, 0xcf, sizeof(f));
//f[0] = 0;
int head = 0, tail = -1;
for(int i = l; i <= n; i++)
{
while(head <= tail && q[head] < i - r) head++;
while(head <= tail && f[i - l] > f[q[tail]]) tail--;
q[++tail] = i - l;
f[i] = f[q[head]] + a[i];
}
for(int i = n + 1 - r; i <= n; i++)
ans = max(ans, f[i]);
cout << ans;
return 0;
}
Subteck2 全对代码:
#include <bits/stdc++.h>
using namespace std;
int n, l, r, ans = -10000000;
int a[200001], f[200001];
int q[200001]; //优先队列
int main()
{
cin >> n >> l >> r;
for(int i = 0; i <= n; i++)
cin >> a[i];
memset(f, 0xcf, sizeof(f));
f[0] = 0;
int head = 0, tail = -1;
for(int i = l; i <= n; i++)
{
while(head <= tail && q[head] < i - r) head++;
while(head <= tail && f[i - l] > f[q[tail]]) tail--;
q[++tail] = i - l;
f[i] = f[q[head]] + a[i];
}
for(int i = n + 1 - r; i <= n; i++)
ans = max(ans, f[i]);
cout << ans;
return 0;
}