2541 好糖
- 2.0 秒
- 262,144.0 KB
- 20 分
- 3级题
给你nn颗糖,每颗糖有一个甜度,一颗糖是好糖当且仅当,去掉这颗糖之后剩下的糖如果从前到后每天吃一个的话,奇数天吃的糖的甜度和与偶数天吃的糖的甜度和相等。问这nn颗糖中有多少颗好糖。
收起
输入
第一行一个正整数n。 第二行n个数表示从前到后每颗糖的甜度。 n<=200000,0<=甜度<=10000。
输出
一个数表示好糖个数。
输入样例
7 5 5 4 5 5 5 6
输出样例
2
枚举每一个位置。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=200000+66;
const ll mod=1e9+7;
int n;
int a[maxn];
ll s1[maxn];//偶数前缀和
ll s2[maxn];//奇数后缀和
ll s3[maxn];//奇数前缀和
ll s4[maxn];//偶数后缀和
int main()
{
int n;
scanf("%d",&n);
ll sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
if(i%2==0)s1[i]+=s1[i-2]+a[i];
else s3[i]+=s3[i-2]+a[i];
}
for(int i=n;i>=1;i--)
{
if(i%2)s2[i]+=s2[i+2]+a[i];
else s4[i]+=s4[i+2]+a[i];
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(i%2==0)
{
//偶数的情况
ll s11=0;
s11+=s1[i];
s11-=a[i];
s11+=s2[i+1];//偶数和更新
ll s12=sum-a[i]-s11;
if(s11==s12)ans++;
}
else
{
ll s11=0;
s11+=s3[i];
s11-=a[i];
s11+=s4[i+1];
ll s12=sum-a[i]-s11;
if(s11==s12)ans++;
}
}
printf("%d\n",ans);
return 0;
}