标签:http typedef 前缀和 targe class number type main content
题目链接:
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; }
标签:http typedef 前缀和 targe class number type main content
原文地址:http://www.cnblogs.com/claireyuancy/p/6820559.html