洛谷AT2828 和がNの区間

题目传送门
题意翻译
给你一组n的排列,记为 A i A_i Ai,问存在多少对L,R,满足 ( ∑ i = L R A i ) = n (\sum\limits_{i=L}^R A_i)=n (i=LRAi)=n
说明
1   ≤   N   ≤   100 , 000 1\ \leq\ N\ \leq\ 100,000 1  N  100,000
思路:
看到求和
有些人就开始暴力了
于是老朋友(祖宗)都来了------WA,TLE,RE…
于是转念一想:用前缀和来做
那这么做呢?
假设我要求 L R LR LR的和
那么我就可以拿sum[R]-sum[L] (sum数组代表前缀和)
CODE:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,a[100010],sum[100010],ans;
signed main() {
	scanf("%lld",&n);
	for(int i=1; i<=n; i++) 
		scanf("%lld",&a[i]),sum[i]=sum[i-1]+a[i];//求前缀和
	for(int i=0; i<n; i++)//考虑1...r可以直接等于n的情况,i的初值为0
		for(int j=i; j<=n; j++)
			if(sum[j]-sum[i]==n) ans++;//区间LR的和为n
			else if(sum[j]-sum[i]>n) break;//和已经大于n了,再加值就更大了
	printf("%lld\n",ans);

	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值