Codeforces 1485F Copy or Prefix Sum
题目链接
题目大意
给定一个长度为 \(N\) 的序列 \(bi\)
问有多少个长度为 \(N\) 的序列 \(a\) 使得
- \(b[i] = a[i]\)
或
- \(b[i] = ∑a[j] , j∈[1,i]\)
解题思路
定义 $dp[i][j] $ 表示前 \(i\) 项的前缀和为 \(j\) 的序列 \(a\) 的个数,其中 \(dp[0][0] = 1\)
( 因为前缀和很大,所以需要用 \(map\) 来操作 )
那么:
当 \(b[i] = a[i]\) 时 , \(dp[i][j] = dp[i - 1][j - b[i]]\)
当 \(b[i] = ∑a[j] , j∈[1,i]\) 时 , \(dp[i][b[i]] = ∑dp[i - 1][j],j∈[-inf,inf]\)
对于第一种转移相当于把整个数组的值向右平移 \(b[i]\)
对于第二种转移需要注意当 \(sum[i-1] = 0\) 时,\(b[i]\) 既等于 \(a[i]\) 又等于 \(∑a[j] , j∈[1,i]\)
相当于多转移了一次 \(dp[i - 1][0]\) ,所以需要减去 \(dp[i - 1][0]\)
最后的答案 \(ans = ∑dp[n][j],j∈[-inf,inf]\) ,复杂度为 \(N^2logN\) ( \(log\) 的复杂度源于 \(map\) )
考虑优化:
定义 \(sum[i]\) 表示长度为 \(i\) 且满足题目条件的序列 \(a\) 的个数
对于第一种转移,只是把数值向右平移,并不会导致答案的个数增加,所以 \(sum[i] = sum[i - 1]\)
对于第二种转移,\(dp[i][b[i]] += sum[i - 1]\) , 同时减去 \(dp[i - 1][0]\) ,相当于 \(sum[i] += sum[i - 1] , sum[i] -= dp[i - 1][0]\)
于是我们可以定义 \(py\) 表示平移的长度,起初 \(py = 0\),每计算完 \(sum[i]\) 后 , 令 \(py += b[i]\)
那么 \(dp[i - 1][j]\) 则可以用 \(dp[j - py]\) 表示
而 \(dp[i][j]\) 则可以用 \(dp[j - py - b[i]]\) 表示
于是可得 \(sum[i] += sum[i - 1] - dp[0 - py]\) , \(dp[b[i] - py - b[i]] += sum[i - ] - dp[0 - py]\)
最后的答案 \(ans = sum[n]\) , 复杂度为 \(NlogN\)
AC_Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3e5 + 10 , mod = 1e9 + 7;
map<int , int>dp;
int b[N];
signed main()
{
int T = 1;
cin >> T;
while(T --)
{
dp.clear();
int n , sum = 1 , py = 0;
cin >> n;
for(int i = 1 ; i <= n ; i ++) cin >> b[i];
dp[0] = 1;
for(int i = 1 ; i <= n ; i ++)
{
int add = (sum - dp[0 - py] + mod) % mod;
sum = (sum + add) % mod , py += b[i];
dp[b[i] - py] = (dp[b[i] - py] + add) % mod;
}
cout << sum << '\n';
}
return 0;
}
Codeforces 1485F Copy or Prefix Sum的更多相关文章
- 4.4 CUDA prefix sum一步一步优化
1. Prefix Sum 前缀求和由一个二元操作符和一个输入向量组成,虽然名字叫求和,但操作符不一定是加法.先解释一下,以加法为例: 第一行是输入,第二行是对应的输出.可以看到,Output[1] ...
- 牛客多校第十场-D- Rikka with Prefix Sum
链接:https://www.nowcoder.com/acm/contest/148/D来源:牛客网 Prefix Sum is a useful trick in data structure p ...
- 牛客网暑期ACM多校训练营(第十场)D Rikka with Prefix Sum (数学)
Rikka with Prefix Sum 题意: 给出一个数组a,一开始全为0,现在有三种操作: 1. 1 L R W,让区间[L,R]里面的数全都加上W: 2. 2 将a数组变为其前缀 ...
- Codeforces 703D Mishka and Interesting sum 离线+树状数组
链接 Codeforces 703D Mishka and Interesting sum 题意 求区间内数字出现次数为偶数的数的异或和 思路 区间内直接异或的话得到的是出现次数为奇数的异或和,要得到 ...
- Rikka with Prefix Sum(组合数学)
Rikka with Prefix Sum 题目描述 Prefix Sum is a useful trick in data structure problems. For example, giv ...
- Educational Codeforces Round 53 E. Segment Sum(数位DP)
Educational Codeforces Round 53 E. Segment Sum 题意: 问[L,R]区间内有多少个数满足:其由不超过k种数字构成. 思路: 数位DP裸题,也比较好想.由于 ...
- Rikka with Prefix Sum
Rikka with Prefix Sum 题目 https://www.nowcoder.com/acm/contest/148/D 题目有三个操作 l到r都添加一个数 取一次前缀和 查询区间和 这 ...
- Codeforces Round #556 (Div. 2) - C. Prefix Sum Primes(思维)
Problem Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 1000 mSec Problem Descripti ...
- Educational Codeforces Round 1 A. Tricky Sum 暴力
A. Tricky Sum Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/598/problem ...
随机推荐
- Jsp数字格式化
日期格式(2008年5月5日22点00分23秒) <fmt:formatDate value="<%=new Date() %>" pattern="y ...
- 开发环境管理利器Vagrant
引言 不知道你是否经历过,开发环境与生产环境不一致.Windows开发和Linux上的包效果不一样.在我这运行时好的啊 等等等问题,那有没有解决方法呢? 答案就是Vagrant.Docker 1.简介 ...
- DEDECMS:更改dede提示框标题
在include文件夹下,修改common.func.php文件里的 <title>DedeCMS提示信息</title> 修改成自己想要的标题. 将 <b>Ded ...
- AtCoder Beginner Contest 171
比赛链接:https://atcoder.jp/contests/abc171/tasks A - αlphabet 题意 给出一个字母,如果为大写输出 'A',如果为小写输出 'a' . 代码 #i ...
- 2020牛客暑期多校训练营(第二场)Fake Maxpooling
传送门:Fake Maxpooling 题意:给出矩阵的行数n和列数m,矩阵 Aij = lcm( i , j ) ,求每个大小为k*k的子矩阵的最大值的和. 题解:如果暴力求解肯定会t,所以要智取 ...
- hdu4521 小明系列问题——小明序列
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission ...
- Educational Codeforces Round 95 (Rated for Div. 2) C. Mortal Kombat Tower (DP)
题意:你和基友两人从左往右轮流打怪兽,强怪用\(1\)表示,垃圾用\(0\)表示,但基友比较弱,打不过强怪,碰到强怪需要用一次魔法,而你很强,无论什么怪都能乱杀,基友先打,每人每次至少杀一个怪兽,最多 ...
- mysql-画图
目录 阿里数据库产品rds 淘宝数据库架构 数据库下载 Mysql3种安装方法 mysql_install_db安装数据库命令脚本中有生成初始mysql数据 也可以把mysql_install_db集 ...
- GO - go mod使用原理
Go Module 依赖管理 go mod使用 原理及使用ref: https://xuanwo.io/2019/05/27/go-modules/ go module的稳定路径: https://l ...
- cccc超级酱油心得
第一次线下比赛献给了cccc. 大致写写自己心得,比赛前一天晚上日常和室友在宿舍玩到11点多,洗漱上床.睡前突然想起第二天还有比赛,顿时激动加紧张.在床上刷了刷知乎和百度,看几道去年的真题,熬到了12 ...