题目链接

描述

小Ho得到了一个数组作为他的新年礼物,他非常喜欢这个数组!

在仔细研究了几天之后,小Ho成功的将这个数组拆成了若干段,并且每段的和都不为0!

现在小Ho希望知道,这样的拆分方法一共有多少种?

两种拆分方法被视作不同,当且仅当数组断开的所有位置组成的集合不同。

输入

每组输入的第一行为一个正整数N,表示这个数组的长度

第二行为N个整数A1~AN,描述小Ho收到的这个数组

对于40%的数据,满足1<=N<=10

对于100%的数据,满足1<=N<=105, |Ai|<=100

输出

对于每组输入,输出一行Ans,表示拆分方案的数量除以(109+7)的余数。

-----------------------------------------------------------------------------------------------------------

容易想到一个N^2的解法:

F[i] = Sum(F[0<=j<i])+(pre[i]!=0),pre[j]!=pre[i]. 其中pre[i]为前缀和。

因为N为10w,所以肯定过不了。

我们可以先不判断pre[j]是否等于pre[i],即维护一个累加和,然后再减去前缀和等于pre[i]的累加和:F[i] = 当前累加和 - pre[i]的累加和。

pre[i]的累加和用map维护,是logN的复杂度。

这样就由N^2降到了NlogN

#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MOD = 1e9+;
const int N = ;
int sum[N];
long long dp[N];
int main(){
long long pre = ;
map<long,long> records;
int n; cin>>n; for(int i=;i<n;i++){
scanf("%d",sum+i); if(i) sum[i]+=sum[i-];
dp[i] = sum[i]?((pre+)%MOD):pre;
auto iter = records.find(sum[i]);
if(iter==records.end()) records[sum[i]]=dp[i];
else {
dp[i] = (dp[i]-iter->second+MOD)%MOD;
iter->second = (iter->second+dp[i])%MOD;
}
pre = (pre+dp[i])%MOD;
}
printf("%lld\n",dp[n-]);
return ;
}

最新文章

  1. gulp如何使用
  2. linux 下的信号量参数
  3. [solr] - SolrJ增删查
  4. 手机端上传未知图片大小,js设置宽高比例
  5. 如何才能将Faster R-CNN训练起来?
  6. 李洪强iOS开发之【Objective-C】07-自定义构造方法和description方法
  7. 巧用FileShare解决C#读写文件时文件正由另一进程使用的bug
  8. HTML常用标签及其全称
  9. 通过gdb调试分析Linux内核的启动过程
  10. 怎样用AIDL Service 传递复杂数据
  11. NAS4Free 安装配置(五)配置SMB
  12. Centos7安装JDK
  13. Java log4j的环境搭建
  14. python中干掉tornado的连接失败日志
  15. Linux基础第四课——文件操作
  16. springmvc+ajax文件上传
  17. PAT甲级1061 Dating
  18. AngularJs -- 内置指令
  19. wcf 服务器无法处理请求由于内部错误
  20. BZOJ 1010: [HNOI2008]玩具装箱toy | 单调队列优化DP

热门文章

  1. jsoup HTML parser hello world examples--转
  2. How to include custom library into maven local repository?--转
  3. firstChild与firstElementChild
  4. GCC中的强符号和弱符号及强引用和弱引用
  5. Spring、Spring MVC、MyBatis 整合文件配置详解
  6. Java基础——Servlet
  7. 路飞学城Python-Day38(第四模块思维导图)
  8. php字符处理
  9. AsyncTask 简要介绍
  10. JS实现缓存运动