hihocoder1475 数组分拆【DP+前缀和优化】
思路:
DP[ i ] 代表以 i 结尾的方案数. dp[i] += sum[i] - sum[j - 1] != 0 ? dp[j] : 0 ;
对于100%的数据,满足1<=N<=105, |Ai|<=100
n 1e5呀,两层for,GG;
利用树状数组维护sum[i],存的是以sum[i]的方案数 ,
那么每次加上当前所有的方案,减去sum[i]的方案,就好了。
这里还有一个小问题就是 |sum[i]|<=1e7,所以先离散化一下就好了。
把当前所有前缀和的方案数加起来。。然后减掉以自己的方案数。
也可以用map.
树状数组维护。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod=1e9+7;
const int N=1e5+10;
LL sval[N],sum[N];
LL dp[N];
int lowbit(int x)
{
return x&(-x);
}
LL Sum(int d)
{
LL ans=0;
while(d)
{
ans=(ans+sval[d])%mod;
d=d-lowbit(d);
}
return ans;
} void add(int d,LL val,int n)
{
while(d<=n)
{
sval[d]=(sval[d]+val)%mod;
d+=lowbit(d);
}
} vector<LL>xs;
int main()
{
LL n,a;
scanf("%lld",&n);
sum[0]=0;
xs.push_back(0);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a);
sum[i]=sum[i-1]+a;
xs.push_back(sum[i]);
}
sort(xs.begin(),xs.end());
auto it=unique(xs.begin(),xs.end());
for(int i=0;i<=n;i++)
sum[i]=lower_bound(xs.begin(),it,sum[i])-xs.begin()+1;
memset(dp,0,sizeof(dp));
for(int i=0;i<=n;i++)
{
dp[i]+=Sum(xs.size());
dp[i]-=Sum(sum[i])-Sum(sum[i]-1);
dp[i]=(dp[i]+mod)%mod;
if(dp[i]==0)
dp[i]=1;
add(sum[i],dp[i],xs.size());
}
printf("%lld\n",dp[n]);
return 0;
}
map维护
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod=1e9+7;
const int N=1e5+10;
LL sum[N];
LL dp[N];
map<int,int>mp; int main()
{
LL n,a;
scanf("%lld",&n);
sum[0]=0;
mp.clear();
for(int i=1;i<=n;i++)
{
scanf("%lld",&a);
sum[i]=sum[i-1]+a;
}
memset(dp,0,sizeof(dp));
dp[0]=1;
mp[0]=1;
LL cnt=1;
for(int i=1;i<=n;i++)
{
if(!mp.count(sum[i]))
{
dp[i]=cnt;
mp[sum[i]]=dp[i];
}
else
{
dp[i]=((cnt-mp[sum[i]])%mod+mod)%mod;
mp[sum[i]]=(mp[sum[i]]+dp[i]+mod)%mod;
}
cnt=(cnt+dp[i]+mod)%mod;
}
printf("%lld\n",dp[n]);
return 0;
}
hihocoder1475 数组分拆【DP+前缀和优化】的更多相关文章
- HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...
- [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列)
[Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列) 题面 两个人玩游戏,共进行t轮,每人每轮从[-k,k]中选出一个数字,将其加到自己的总分中.已 ...
- T2988 删除数字【状压Dp+前缀和优化】
Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...
- Codeforces 479E. Riding in a Lift (dp + 前缀和优化)
题目链接:http://codeforces.com/contest/479/problem/E 题意: 给定一个启示的楼层a,有一个不能去的楼层b,对于你可以去的下一个楼层必须满足你 ...
- 2018多校第九场 HDU 6416 (DP+前缀和优化)
转自:https://blog.csdn.net/CatDsy/article/details/81876341 #include <bits/stdc++.h> using namesp ...
- BZOJ 1044: [HAOI2008]木棍分割 DP 前缀和优化
题目链接 咳咳咳,第一次没大看题解做DP 以前的我应该是这样的 哇咔咔,这tm咋做,不管了,先看个题解,再写代码 终于看懂了,卧槽咋写啊,算了还是抄吧 第一问类似于noip的那个跳房子,随便做 这里重 ...
- Student's Camp CodeForces - 708E (dp,前缀和优化)
大意: $n$行$m$列砖, 白天左侧边界每块砖有$p$概率被摧毁, 晚上右侧边界有$p$概率被摧毁, 求最后上下边界连通的概率. 记${dp}_{i,l,r}$为遍历到第$t$行时, 第$t$行砖块 ...
- 5.19 省选模拟赛 小B的夏令营 概率 dp 前缀和优化dp
LINK:小B的夏令营 这道题是以前从没见过的优化dp的方法 不过也在情理之中. 注意读题 千万不要像我这个sb一样 考完连题意都不知道是啥. 一个长方形 要求从上到下联通的概率. 容易发现 K天只是 ...
- CDOJ ABCDE dp(前缀和优化)
题目链接: http://acm.uestc.edu.cn/#/problem/show/1307 ABCDE Time Limit: 1000/1000MS (Java/Others)Memory ...
随机推荐
- (图解)Description Resource Path Location Type Java compiler level does not match the version of
Description Resource Path Location Type Java compiler level does not match the version of project 编译 ...
- 字符串的朴素模式和KMP模式匹配
先复习一下字符串指针: #include <iostream> #include <string.h> using namespace std; int main() { ch ...
- 编写你的第一个django应用程序3
这一篇从教程第2部分结尾的地方继续讲起.我们将继续编写投票应用,并且专注于如何创建公用界面--也被称为视图 概况 django视图概念是一类具有相同功能和末班的网页的集合,比如,在一个博客应用中,你可 ...
- JavaScript:学习笔记(4)——This关键字
JavaScript:学习笔记(4)——This关键字 以前这篇帖子是关于闭包的,但是我想弄明白的其实是This关键字.JavaScript的this和Java等面向对象语言中的this大不一样,bi ...
- Android 虚拟机 程序安装目录
Android应用安装涉及到如下几个目录:system/app系统自带的应用程序,无法删除.data/app用户程序安装的目录,有删除权限.安装时把apk文件复制到此目录.data/data存放应用程 ...
- 数据解析,懒加载,代理ip
在前面的requests流程中,还缺少了一步重要的流程,就是在持久化存储之前需要进行制定的数据解析.因为在大多数情况下,我们都会使用聚焦爬虫,也就是爬取页面中的指定部分数据值,而不是整个页面的数据. ...
- Win8+VS2012 配置OpenGL SuperBible5 环境
(1)glew: 版本:1.7.0-win32 下载地址:https://sourceforge.net/projects/glew/files/glew/ 安装步骤: 将include文件夹下的.h ...
- Cmder配置
中文乱码和重叠 当我们使用ls命令查看文件目录时,发现,中文被显示成了一些奇怪的乱码,将以下几行代码配置在cmder/config/user-aliases下即可解决问题: l=ls --show-c ...
- 初学OpenMP
这两天在看多核计算的书,就要用到openmp,因为我使用vs2015,从微软可以看到是支持openmp2.0版本的 具体使用: 在vs里创造一个控制台项目,然后打开属性管理器,在属性管理器里找到配置属 ...
- Spring Boot2.0之性能优化
1.JVM参数调优 针对运行效果 吞吐量 初始堆内存与最大堆尽量相同 减少垃圾回收次数 2.扫包优化: 启动优化 默认Tomcat容器改为Undertow Tomcat的吞吐量500 ...