其他分享
首页 > 其他分享> > 哈啤题

哈啤题

作者:互联网

称一个长度为\(2K\)的序列是好的,当且仅当这个序列的前\(K\)个之和\(\le S\),且后\(K\)个之和\le S$。

现在,给你一个长度为n的序列,请你求出以这个序列每个位置开头的最长的好的连续子序列。

输入格式
第一行两个整数\(n,S\)。

接下来\(n\)行,每行一个非负整数\(a_i\),表示这个序列。

输出格式
\(n\)行,表示答案。

样例1
input

5 10000
1
1
1
1
1

output

4
4
2
2
0

样例2
input

8 3
1
1
1
1
1
1
1
1

output

6
6
6
4
4
2
2
0

数据范围
\(30\%\)的数据,\(n\le1000\)。

\(100\%\)的数据:\(1\le n\le10^5,S\le2\times10^9,\sum a_i\le2\times10^9\).

时间限制:1S

空间限制:256MB

仔细一想发现如果枚举序列的开头很难判断,所以我们枚举序列前一半和后一半的分界点,令现在枚举到前一半结尾为i,后一半结尾为i+1。
那么前后最远能到哪里可以用二分去扩展,加个前缀和,保证和小于等于s,二分就可以了。按照题目,我们必须前后一起扩展,那么答案会增加前后扩展数量的最小值。复杂度\(O(nlogn)\)
然而还有更好的方法。仔细想起来,我们要求能往后扩展多少,这个问题可以用双指针解决,利用好之前求出来的内容,那么往前扩展也就是倒着再跑一遍双指针了。所以可以达到\(O(n)\)的复杂度。

标签:le,一半,扩展,哈啤题,枚举,序列,input
来源: https://www.cnblogs.com/mekoszc/p/16101425.html