哈啤题
作者:互联网
称一个长度为\(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