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 ...
随机推荐
- 【题解】数字组合(NTT+组合 滑稽)
[题解]数字组合(NTT+组合 滑稽) 今天实践一下谢总讲的宰牛刀233,滑稽. \((1+x)(1+x)(1+x)\)的\(x^2\)系数就代表了有三个一快钱硬币构成的两块钱的方案数量. 很好理解, ...
- php依据地理坐标获取国家、省份、城市,及周边数据类
功能:当App获取到用户的地理坐标时,能够依据坐标知道用户当前在那个国家.省份.城市.及周边有什么数据. 原理:基于百度Geocoding API 实现.须要先注冊百度开发人员.然后申请百度AK(密钥 ...
- 一起来学linux:shell script(二)关于脚本
(一)首先来看shell脚本的执行方式,shell脚本的后缀名都是sh文件. 1 sh test.sh 2 source test.sh 这两种方式有什么区别呢.test.sh 里的脚本很简单, 从键 ...
- ls bash: cannot create temp file for here-document: No space left on device
出现这种问题,一般是磁盘空间满了,或者是inode满了 使用命令: df -h查询磁盘空间 df -i 查询inode占用 Filesystem Inodes IUsed IFree IUse% Mo ...
- Java for LeetCode 114 Flatten Binary Tree to Linked List
Given a binary tree, flatten it to a linked list in-place. For example, Given 1 / \ 2 5 / \ \ 3 4 6 ...
- linux下编译安装python
从官网下载指定的源码包 https://www.python.org/downloads/source/ 把源码文件以二进制方式上传到linux服务器 安装python需要用到gcc工具,首先查看gc ...
- 使用valgrind进行内存泄漏和非法内存操作检测
valgrind是一个强大的工具,最常用的功能是用它来检测内存泄漏和非法内存的使用.要想让valgrind报告的更加细致,请使用-g进行编译. 基本命令如下: $ valgrind --tool=me ...
- 算法(Algorithms)第4版 练习 1.3.29
代码实现: //1.3.29 package com.qiusongde.linkedlist; import java.util.Iterator; import java.util.NoSuchE ...
- 打造vim成类source insight
一.Ubuntu14.04下配置 1.配置vimrc文件 输入:version课查看vimrc文件及位置: system vimrc file: "$VIM/vimrc" user ...
- Rabbitmq+Nginx+keepalived高可用热备
摘自: http://www.cnblogs.com/wangyichen/p/4917241.html 公司两台文件服务器要做高可用,避免单点故障,故采用keepalived实现,其中一台宕机,依靠 ...