acwing成绩数量
阅读了一篇题解后稍微改了一下,不用考虑s[0]的问题
核心思路一样:统计前缀和为偶数的个数和前缀和为奇数的个数然后利用组合数解决问题
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
int main(){
int n;
scanf("%d",&n);
// ll p_count=0,n_count=0;
ll s0=1,s1=0; // s0表示前缀和区间里面(奇数的个数为偶数)的前缀和的个数,s1表示前缀和区间里面(奇数的个数为奇数的)前缀和的个数;
int s = 0; // s表示当前输入x后截止到目前当前区间奇数的个数是偶数还是奇数个
while(n--){
int x;
scanf("%d",&x);
if(x<0) s = s + 1; // 如果输入的x<0,即当前区间前缀和为奇数的个数+1后更新
// 每次循环输入一个x,增加序列长度的时候,就需要当即判断当前区间长度里面s的奇偶型来判断目前s0,s1的个数
if(s & 1) s1++;
else s0++;
}
printf("%lld %lld\n",s0*s1,(s0*(s0-1))/2+ (s1*(s1-1))/2 );
return 0;
}