题目链接

题目描述

给定一个数组a[N],N小于1e5。把数组划分成若干个片段,每个片段的和都不为0,问有多少种划分方法?

方法描述

定义f(i)表示0~i共有多少种划分方式,则$f(j)=\sum_{i\in[0,j) and sum(a[i+1:j]) \ne 0} f(i)$
相当于统计$f(j)=\sum_{i \in [0,j)} f(i)-\sum_{i \in [0,j) and sum(a[i+1:j])==0} f(i)$。对于此式第二项可以使用map记录下来,满足sum(a[i+1:j])的那些i,必定满足prefix[i]==prefix[j],prefix[i]表示前缀和,即0~i之间全部元素之和。

#include<iostream>
#include<stdio.h>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 1e9 + 7;
const int maxcount = 1e5 + 3;
const int maxvalue = 103;
int n;
int a[maxcount];
int pre[maxcount];
map<int, int>ma;
int main() {freopen("in.txt", "r", stdin);cin >> n;for (int i = 0; i < n; i++)scanf("%d", a + i+1); pre[0]=a[0] = 0;ma[0] = 1;for (int i = 1; i <= n; i++)pre[i] = pre[i - 1] + a[i];  ll s = 1;ll now = 0;for (int i=1; i <= n; i++) {  now = (s- ma[pre[i]]+maxn)%maxn;  s = (s + now) % maxn; if (ma.count(pre[i]) == 0)ma[pre[i]] = 0;ma[pre[i]] = (ma[pre[i]]+now)%maxn;} cout << now<< endl;return 0;
}

转载于:https://www.cnblogs.com/weiyinfu/p/10125574.html

hihocoder第233周相关推荐

  1. hihoCoder 第136周 优化延迟(二分答案+手写堆)

    题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...

  2. hihocoder第220周-一道拧巴的题

    一.220周 题目链接 问题描述 键盘上有N个数字按键,每个按键只能按一次,每次可以按下多个键,请输出所有可能的按键情况. 输入一个整数N(N在1~8之间),输出全部的按键可能.例如:输入3,输出为 ...

  3. hihocoder 第113周 Fibonacci(动态规划)

    题目大意:给定一个数字序列,求该序列的所有子序列中有多少是斐波拉契数列的前缀,即满足"1 1 2 3 ..."的形式. 解题思路:首先注意ai的范围,首先可以肯定斐波拉切数列不会太 ...

  4. hihocoder第238周:杨氏矩阵的个数

    题目链接 问题描述 给定一个N行M列的矩阵,往里面填入$1-N\times M$个数字,使得这个矩阵每行.每列都满足递增.问:有多少种填法? 问题分析 这个问题很难,如果能够直接想到,那就是天才了. ...

  5. hihocoder第237周:三等分带权树

    题目链接 问题描述 给定一棵树,树中每个结点权值为[-100,100]之间的整数.树中包含结点总数不超过1e5.任选两个非根节点A.B,将这两个结点与其父节点断开,可以得到三棵子树.现要求三棵子树的权 ...

  6. hihocoder第229周:最大连续字母个数

    题目链接 给定一个仅包含小写字母的字符串s(长度小于1e5),你可以交换任意两个字符的位置,现在允许交换k次,要求交换之后,s中最长的连续相同字符个数尽量多,求这个最长连续区间的长度. 样例 输入 1 ...

  7. hihocoder第226周:打表找规律

    题目列表 问题描述 有一个文本框,可以执行以下操作: 输入A Ctrl+C 复制 Ctrl+V 粘贴 Ctrl+A 全选 N次操作最多能够造出多少个A来? 输入一个N,输出一个整数,表示最多有多少个A ...

  8. hihocoder第218周:AC自动机

    题目链接 问题描述 给定n个单词,给定一个长字符串s,单词总长度和字符串s的长度都不超过1e5.要求把s中所有的出现单词的位置用*替代. 例如: 样例输入 2 abc cd abcxyzabcd 样例 ...

  9. hihocoder第212周-动态规划

    题目链接 import java.util.Scanner;public class Main { long mod = (long) (1e9 + 7); int MAXN = 107; int a ...

最新文章

  1. SVN删除文件及其恢复问题详解
  2. 【C++】38.类成员变量声明为 对象与指针的区别
  3. 《Effective C++》读书笔记(第二部分)
  4. git小乌龟一次性设置密码
  5. web 应用开发最佳实践之一:避免大型、复杂的布局和布局抖动
  6. java sqlmap_sqlmap 学习指南
  7. Codeforces 235C
  8. c# 定位内存快速增长_改善C#程序,提高程序运行效率的50种方法
  9. g++链接boost库
  10. 中国象棋口诀及要领精髓
  11. vue ---- 组件综合案例(购物车案例)
  12. cocos2d笔记 (4)cocos2d里的各种动作
  13. keepalived 单播模式
  14. 服务器能不能用普通硬盘,服务器硬盘与普通硬盘之间的区别
  15. word两种html区别,word文本框有哪两种方式?
  16. 拼图游戏怎样切换代码html,HTML5技术之图像处理:一个滑动的拼图游戏-H5教程
  17. Gmail:如何撤回发出的邮件?
  18. Eagle电路板绘制
  19. 模式识别类毕业论文文献都有哪些?
  20. 常用软件分享及下载地址

热门文章

  1. 两个方法事务调用问题
  2. ascii码和unicode
  3. [MySQL] - MySQL连接字符串总结 (转)
  4. sql server内置存储过程、查看系统信息
  5. iframe之间操作记录
  6. getFullYear 方法
  7. mysql分组取每组前几条记录(排序)
  8. int与string互转
  9. Flash已死,有事烧纸!
  10. cnforyou被收购了,没地方买书了