http://codeforces.com/contest/1118/problem/B
题意:
有n颗糖,每颗糖都有一个质量,拿出其中一颗糖,剩下的糖的奇数位置上的质量和 和 偶数位置上的质量和相等的有多少个
思路:
对于拿掉第i位数的话,第i位之前的奇偶性是不变的,第i位之后的奇偶性是和原来相反的,所以我们用前缀和,分别求出奇数位置上的前缀和和偶数位置上的前缀和,然后对于第i位拿掉了以后就是判断一下前i-1位的奇数前缀和加上后面偶数位的前缀和是否等于前i-1位的偶数前缀和加上后面奇数位置的前缀和。
参考了大佬的思路:https://blog.csdn.net/Charles_Zaqdt/article/details/87774079
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
#include<queue>
#include<algorithm>
#define mod 1000000007
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int s[maxn];
int a[maxn],b[maxn];
int main()
{
int n;
scanf("%d",&n);
int j,k;
// j 为偶数个数
// k 为奇数个数
a[0] = b[0] = 0;
j = k = 0;
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
if(i%2==0) //偶数前缀和
{
j++;
a[j] = a[j-1]+s[i];
}
else //奇数前缀和
{
k++;
b[k] = b[k-1]+s[i];
}
}
int m = 0;
for(int i=1;i<=n;i++)
{
int x = a[(i-1)/2]; // i 之前的偶数和
int y = b[i/2]; // i 之前的奇数和
//拿出第 i 颗糖,i 之后的偶数和变为奇数和,i 之后的奇数和变为偶数和
// 因为去掉 i 后,i之后的数 奇偶性交换
if(i%2==0)
{
if(b[k]-y+x == a[j]-x-s[i]+y)
m++;
}
else
{
if(b[k]-y-s[i]+x == a[j]-x+y)
m++;
}
}
printf("%d\n",m);
return 0;
}