Codeforces466C Number of Ways
2017-05-07 13:11
288 查看
题目链接:
http://codeforces.com/problemset/problem/466/C
题意:
给一个长度为n的数组,将其分成连续的三段使三段的和相等。求有几种这种组合
分析:
从头扫到尾。将全部的前缀和为(sum/3)的点统计起来。然后再从尾開始统计。找到统计全部后缀和为(sum/3)的节点 然后这样的方案的数为
这个点之前全部前缀和为sum/3的个数
代码例如以下:
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
- Number of Ways
- Codeforces Round #266 (Div. 2)C. Number of Ways(想法题)
- 【CODEFORCES】 C. Number of Ways
- codeforces 466 C Number of Ways
- [LeetCode] Number of decoding ways
- CF 266 C. Number of Ways
- Q9.11 count the number of ways of parenthesizing the expression
- codeforces round #266 C. Number of Ways
- Number of Ways
- Codeforces Round #266 (Div. 2) C. Number of Ways
- CareerCup Number of ways to take n identical objects out of a bucket
- B - Number of Ways
- codeforces 之 Number of Ways
- cf466C Number of Ways
- Codeforces - 466C. Number of Ways - 思维、暴力
- C. Number of Ways
- Codeforces 466 C. Number of Ways
- cf466C Number of Ways
- Codeforces-466C-Number of Ways