小码笔手上有一串珍珠链,共有 N 颗珍珠,珍珠的颜色值用 1 到 M 的整数表示。我们称一个珍珠链的 2×k 长度的子串是“漂亮的”,当且仅当该子串中前 k 个珠子的颜色值之和或最后 k 个珠子的颜色值之和都小于等于 S。
现给出珍珠链每颗珠子的颜色值,对于每一颗珠子,输出从该珍珠开始最长的漂亮子串的长度。
第一行包含整数 N 和 S。
下面的 N 行,每行包含珍珠链中的一个颜色值 si。这些整数都是正的且它们的和不超过 2×109。
输出共 N 行。第 i 行包含一个整数,表示从第 i 个珍珠开始最长的漂亮子串的长度
如果当前位置上没有漂亮子串,输出 0。
5 10000
1
1
1
1
1
4
4
2
2
0
5 9
1
1
10
1
9
2
0
0
2
0
8 3
1
1
1
1
1
1
1
1
6
6
6
4
4
2
2
0
【样例解释#1】
对于样例 1 的第一个位置,k 的值最大为 2,并且前两个珍珠颜色值加起来为 2,后两个珍珠颜色值加起来为 2,都小于 10000,故最长长度的漂亮子串长度为 4。
【数据范围】
对于 100% 的数据,2≤N≤105,1≤S≤2×109
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, S;
cin >> N >> S;
vector<int> colors(N);
for (int i = 0; i < N; i++) {
cin >> colors[i];
}
vector<int> leftSum(N, 0);
vector<int> rightSum(N, 0);
leftSum[0] = colors[0];
for (int i = 1; i < N; i++) {
leftSum[i] = leftSum[i-1] + colors[i];
}
rightSum[N-1] = colors[N-1];
for (int i = N-2; i >= 0; i--) {
rightSum[i] = rightSum[i+1] + colors[i];
}
vector<int> result(N, 0);
for (int i = 0; i < N; i++) {
int maxLen = 0;
for (int k = 1; k <= min(i+1, N-i); k++) {
int left = i - k + 1;
if (left == 0 || leftSum[left-1] <= S) {
maxLen = max(maxLen, k);
}
}
for (int k = 1; k <= min(i, N-i-1); k++) {
int right = i + k - 1;
if (right == N-1 || rightSum[right+1] <= S) {
maxLen = max(maxLen, k);
}
}
result[i] = maxLen;
}
int currLen = result[0];
cout << currLen << " ";
for (int i = 1; i < N; i++) {
if (currLen > 0) {
currLen--;
} else {
currLen = result[i];
}
cout << currLen << " ";
}
return 0;
}