题目传送门
题意翻译
给你一组n的排列,记为
A
i
A_i
Ai,问存在多少对L,R,满足
(
∑
i
=
L
R
A
i
)
=
n
(\sum\limits_{i=L}^R A_i)=n
(i=L∑RAi)=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;
}