加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C. Number of Ways(前缀和)

发布时间:2020-12-16 07:19:53 所属栏目:百科 来源:网络整理
导读:题目链接:http://codeforces.com/problemset/problem/466/C ? 题目大意: 给你一个长度为n的序列,让你将其分为三个区间,每个区间的和相等,求分的方法有几种? ? 正好最近学了前缀和,这道题目恰巧是一个前缀和的题 首先我们进行判断该序列的总和是否可以

题目链接:http://codeforces.com/problemset/problem/466/C

?

题目大意: 给你一个长度为n的序列,让你将其分为三个区间,每个区间的和相等,求分的方法有几种?

?

正好最近学了前缀和,这道题目恰巧是一个前缀和的题

首先我们进行判断该序列的总和是否可以整除3: 如果不可以那么输出0

随后我们先求后缀和,如果后缀和 sum/3 相等,那么我们就用标记数组标记。最后在对标记数组求后缀和(cnt[i] 代表i->n 之间可以为第三个区间左边界的个数)

我们再求前缀和,如果前缀和和 sum/3 相等,那么个数 res += cnt[i+2]??

为什么是i+2?

因为我们要确保有三个区间,如果是i+1的话不能够确保有第三个区间

?

AC代码:

 1 #include <cstdio>
 2 #include <string>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <cstdbool>
 6 #include <string.h>
 7 #include <math.h>
 8 
 9 using namespace std;
10 
11 typedef long long LL;
12 const int maxn = 500005;
13 int a[maxn],cnt[maxn];
14 
15 int main()
16 {
17     int n;
18     LL res = 0;
19     LL sum = 0;
20     cin >> n;
21     for (int i=1;i<=n;i++)
22     {
23         cin >> a[i];
24         sum += a[i];
25     }
26     if (sum % 3 != 0)
27     {
28         printf("0n");
29     }
30     else
31     {
32         sum /= 3;
33         LL ss = 0;
34         for (int i=n;i>=1;i--)
35         {
36             ss += a[i];
37             if (ss == sum)
38                 cnt[i]++;
39         }
40         for (int i=n-1;i>=1;i--)
41         {
42             cnt[i] += cnt[i+1];
43         }
44         ss = 0;
45         for (int i=1;i<=n;i++)
46         {
47             ss += a[i];
48             if (ss == sum)
49                 res += (LL)cnt[i+2];
50         }
51         cout << res << endl;
52     }
53     return 0;
54 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读