Codeforces466C Number of Ways
阿新 • • 發佈:2017-05-07
ace ems ring tin ons 代碼 節點 -- 題意
題目鏈接:
http://codeforces.com/problemset/problem/466/C
題意:
給一個長度為n的數組,將其分成連續的三段使三段的和相等。求有幾種這種組合
分析:
從頭掃到尾。將全部的前綴和為(sum/3)的點統計起來。然後再從尾開始統計。找到統計全部後綴和為(sum/3)的節點 然後這樣的方案的數為
這個點之前全部前綴和為sum/3的個數
代碼例如以下:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 500010; typedef long long LL; LL a[maxn]; int cnt[maxn]; int main() { int n; LL x; while(~scanf("%d",&n)){ LL s=0,p=0; memset(cnt,0,sizeof(cnt)); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); s+=a[i]; } if(s%3){puts("0");continue;} s/=3; int com=0; for(int i=1;i<=n;i++){ p+=a[i]; if(p==s) cnt[com++]=i; } LL ans = 0; p=0; for(int i=n;i>=1;i--){ p+=a[i]; // cout<<"p "<<p<<endl; if(p==s){ int pos=lower_bound(cnt,cnt+com,i-1)-cnt; // cout<<"pos "<<pos<<endl; ans+=pos; } } cout<<ans<<endl; } return 0; }
Codeforces466C Number of Ways