51NOD--2541 好糖--前缀后缀和思想

2541 好糖

  1. 2.0 秒
  2.  
  3. 262,144.0 KB
  4.  
  5. 20 分
  6.  
  7. 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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值