记录编号 573112 评测结果 AAAAAAAAAA
题目名称 [東方S1] 琪露诺 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 C++ 运行时间 0.045 s
提交时间 2022-07-17 19:52:18 内存使用 4.73 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e5 + 5;
int n,L,R,a[maxn],pre[maxn],f[maxn];
int Q[maxn],head = 1,tail = 0;
stack<int> s;
int main() {
	freopen("iceroad.in","r",stdin);
	freopen("iceroad.out","w",stdout);
	scanf("%d %d %d",&n,&L,&R);
	for(int i = 0;i <= n;++ i)scanf("%d",&a[i]);
	for(int i = 1;i < L;++ i)f[i] = -2e9; 
	for(int i = L;i <= n + R;++ i) {
		for(;head <= tail&&f[Q[tail]] < f[i - L];)Q[tail --] = 0;
		Q[++ tail] = i - L;
		for(;head <= tail&&Q[head] < i - R;)Q[head ++] = 0;
		pre[i] = Q[head];
		f[i] = f[Q[head]] + a[i];
	}
	int id = n + 1;
	for(int i = n + 2;i <= n + R;++ i) {
		if(f[i] > f[id]) {
			id = i;
		}
	}
	for(int x = id;;x = pre[x]) {
		s.push(x);
		if(!x)break ;
	}
	printf("%d\n",f[id]);
	while(!s.empty()) {
		if(s.top() > n)printf("-1");
		else printf("%d ",s.top());
		s.pop();
	}
	return 0;
}