题目链接:点击查看

题目大意:给出数组 bbb,问可以构造出多少种满足条件的数组 aaa,规定数组 aaa 和数组 bbb 的关系如下:

  1. bi=aib_i = a_ibi​=ai​ or
  2. bi=∑j=1iajb_i = \sum_{j=1}^{i} a_jbi​=∑j=1i​aj​

题目分析:乍一看是个计数问题,因为对于每个位置,aia_iai​ 都有两种选择,所以答案将会是 2n2^n2n 级别的,但是有些时候会重复计数,观察当 (∑j=1i−1aj)=0(\sum_{j=1}^{i-1} a_j)=0(∑j=1i−1​aj​)=0 时,aia_iai​ 有且仅有一种选择,那就是等于 bib_ibi​ 了

所以先设计一个 n2n^2n2 级别的 dpdpdp,dpi,jdp_{i,j}dpi,j​ 代表到了第 iii 个位置,前缀和为 jjj 时的方案数,转移的话也是比较简单,可以分别从上面两种情况进行转移:

  1. bi=aib_i=a_ibi​=ai​,dp[i][j]=dp[i−1][j−bi]dp[i][j]=dp[i-1][j-b_i]dp[i][j]=dp[i−1][j−bi​]
  2. bi=∑j=1iajb_i = \sum_{j=1}^{i} a_jbi​=∑j=1i​aj​,dp[i][bi]=(∑dp[i−1][j])−dp[i−1][0]dp[i][b_i]=(\sum dp[i-1][j])-dp[i-1][0]dp[i][bi​]=(∑dp[i−1][j])−dp[i−1][0]

注意上面第二种情况减去的 dp[i−1][0]dp[i-1][0]dp[i−1][0] 就是去掉 sum=0sum=0sum=0 的方案数

考虑其实很多转移都是无用的,也就是统一偏移了固定的单位,所以我们可以参考 “水平线优化dp” 的博客:https://codeforces.com/blog/entry/58316

维护一个偏移量辅助转移,这样第一种情况就可以直接 O(1)O(1)O(1) 维护了,而对于第二种情况,也只是需要单独查一下 dp[i−1][0]dp[i-1][0]dp[i−1][0] 这一项,剩下的将 dpdpdp 数组滚动一下就可以了

代码:

// Problem: F. Copy or Prefix Sum
// Contest: Codeforces - Codeforces Round #701 (Div. 2)
// URL: https://codeforces.com/contest/1485/problem/F
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
const int mod=1e9+7;
map<LL,LL>mp;
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--) {mp.clear();int n;read(n);LL delta=0,ans=1;mp[0]=1;for(int i=1;i<=n;i++) {int x;read(x);LL temp=(ans-mp[-delta]+mod)%mod;mp[-delta]=(mp[-delta]+temp)%mod;delta+=x;ans=(ans+temp)%mod;}cout<<ans<<endl;}return 0;
}

CodeForces - 1485F Copy or Prefix Sum(dp)相关推荐

  1. codeforces1485 F. Copy or Prefix Sum(dp)

    F. Copy or Prefix Sum Venice technique简要就是懒标记思想. 由于前缀和数组和原数组一一对应,这里我们选择求aia_iai​的前缀和数组的方案数(下面aia_iai ...

  2. codeforces 14E. Camels(多维dp)

    题目链接:http://codeforces.com/problemset/problem/14/E 题意:就是给出n个点要求画出t个波峰和t-1个波谷 很显然要t个波峰和t-1个波谷开始是波动一定是 ...

  3. Prefix Sum 总结

    注意:prefixsum一般都是用PrefixSum[n+1]的数组,prefix[0] = 0; 那么 因为i, j 是A里面的坐标,而prefixsum比A多了1:所以原来的sum[j] - su ...

  4. codeforces 540D Bad Luck Island (概率DP)

    题意:会出石头.剪刀.布的人分别有r,s,p个,他们相互碰到的概率相同,输的人死掉,问最终活下去的人是三种类型的概率 设状态dp(i,j,k)为还有i个石头,j个剪刀,k个布时的概率,dp(r,s,p ...

  5. 牛客网暑期ACM多校训练营(第九场)H. Prefix Sum(CDQ分治)

    题目描述 Niuniu has learned prefix sum and he found an interesting about prefix sum. Let's consider (k+1 ...

  6. Codeforces 148D. Bag of mice(概率dp)

    Codeforces 148D. Bag of mice(概率dp) Description The dragon and the princess are arguing about what to ...

  7. 【Codeforces Round #466】E. Cashback DP+ST表

    题意 给定$n$个数,将其划分成若干个连续的子序列,求最小价值,数组价值定义为,数组和减去$\lfloor \frac{k}{c} \rfloor$,$k$为数组长度,$c$为给定数 可以列得朴素方程 ...

  8. 牛客网暑期ACM多校训练营(第十场)D Rikka with Prefix Sum

    链接:https://www.nowcoder.com/acm/contest/148/D 来源:牛客网 题目描述 Prefix Sum is a useful trick in data struc ...

  9. 【CodeForces - 1150C】Prefix Sum Primes(思维)

    题干: We're giving away nice huge bags containing number tiles! A bag we want to present to you contai ...

最新文章

  1. ***PHP中empty()和isset()的区别
  2. VC++如何判断当前操作系统是32位还是64位?
  3. 移植开源QT软件-SameGame
  4. .Net Core跨平台应用研究-HelloArm(串口篇)
  5. oracle--逻辑对象--bai
  6. UCloud科创板上市获受理,相关文件披露重要经营信息
  7. ServletContextListener 的应用
  8. next数组_数据结构之数组与链表
  9. 小球碰撞(理解ing)
  10. 企业开展自媒体推广,重点是什么?
  11. 阿里云 Aliplayer高级功能介绍(九):自动播放体验...
  12. 固态硬盘颗粒有哪些?固态硬盘SLC、MLC、TLC、QLC有什么不同?
  13. 本地时间 与 UTC 时间 相互转化
  14. 网页认证上网服务器无响应,portal认证失败,网络故障或者portal服务器没有响应排查方法...
  15. X-Plane飞行模拟器购买安装
  16. pc端常用电脑屏幕 媒体查询尺寸
  17. ubuntu执行uci出现 uci: error while loading shared libraries: lib
  18. 基岩版刷铁傀儡机制和Java_我的世界基岩版刷铁塔怎么做好?
  19. 吴恩达deeplearning.ai深度学习课程空白作业
  20. NCUT 数据库基础 铁路购票系统

热门文章

  1. gcc生成dll linux,gcc编译dll和调用dll
  2. SpringAMQP--入门案例的消息接收
  3. 初识Docker-Docker的安装
  4. HTTPS证书的申请过程
  5. Redis中的可用性保证之Sentinel的Ratf 算法
  6. 线程池状态和使用注意点
  7. 常见的web应用服务器
  8. MapReduce运行机制-Reduce阶段
  9. 微服务发现组件Eureka:简介以及Eureka服务端开发
  10. linux中wget命令出现错误,(转)linux中wget未找到命令