Codeforces-466 C-Number of Ways-組合せ数学
4533 ワード
https://codeforces.com/problemset/problem/466/C
データを均等な非空の3つのグループに分けるには,2番目の分割点を決定するたびに(それ以外の)1番目の分割点の数を加算すればよい.最後に3組目に少なくとも1つ残しておくのを覚えています.
転載先:https://www.cnblogs.com/Yinku/p/10397267.html
データを均等な非空の3つのグループに分けるには,2番目の分割点を決定するたびに(それ以外の)1番目の分割点の数を加算すればよい.最後に3組目に少なくとも1つ残しておくのを覚えています.
#include
using namespace std;
#define ll long long
int n;
int a[500005];
int main(){
scanf("%d",&n);
for(int i=0;i)
scanf("%d",&a[i]);
ll sum=0;
for(int i=0;i){
sum+=a[i];
}
if(sum%3!=0){
puts("0");
return 0;
}
ll d=sum/3;
int z1=0;
ll cnt=0;
ll cur=0;
int inc=0;
int i=0;
while(i<n){
cur+=a[i];
if(cur==d){
z1++;
inc=1;
}
else{
inc=0;
}
if(z1>=1){
if(cur==2ll*d){
if(i<=n-2){
// n-1
if(inc)
cnt+=z1-1;
else
cnt+=z1;
//printf("cnt=%lld i=%d
",cnt,i);
}
}
}
i++;
}
printf("%lld
",cnt);
}
転載先:https://www.cnblogs.com/Yinku/p/10397267.html