CF1352E Special Elements

CF1352E Special Elements

题意:给你\(a\)数列,让你判断其中的每个元素是否能写成数列中几个连续元素之和,并统计个数。

这道题乍一看维护前缀和,枚举端点查找。\(O(n^2*t)\)的复杂度,但是一些特性让它的跑不满,就可以过了。

几个非常有意思的数据范围包括:\(1\leq n\leq 8000,1\leq a_i \leq n\)

注意到他让你求的并不是任意一个数,而是\(a_i\),并且\(1\leq a_i \leq n\),也就是说他让你找的数其实只是在一到八千的范围内。对于枚举的\(l\),如果\(sum[r]-sum[l-1]>8000\),就不需要接着枚举\(r\)了。

那么处理前缀和,再开8000个桶分别装每一个数据就可以了

for (int l = 1; l < n; l++) 
{
	for (int r = l + 1; r <= n; r ++) 
    {
		int sum = b[r] - b[l - 1];
		if(sum<=n) vis[sum]++;
		else break;
	}
}
posted @ 2020-06-08 21:44  小蒟蒻皮皮鱼  阅读(128)  评论(0)    收藏  举报