1. 程式人生 > >Codeforces - 466C - Number of Ways - 組合數學

Codeforces - 466C - Number of Ways - 組合數學

sin mes tps 至少 ces amp names 記得 ace

https://codeforces.com/problemset/problem/466/C

要把數據分為均等的非空的三組,那麽每次確定第二個分割點的時候把(除此之外的)第一個分割點的數目加上就可以了。記得最後給第三組留至少一個。

#include<bits/stdc++.h>
using namespace std;
#define ll long long

int n;
int a[500005];

int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);

    ll sum
=0; for(int i=0;i<n;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\n",cnt,i);
} } } i++; } printf("%lld\n",cnt); }

Codeforces - 466C - Number of Ways - 組合數學