Codeforces587B-DP+优化
来源:互联网 发布:c4d软件 编辑:程序博客网 时间:2024/06/01 08:02
Codeforces587B-Duff in Beach
传送门
题意:
给出一个有l个数的序列,序列每n个数一循环,在每个循环里取一个数,一共取1-k个数,要求取出来的子序列要递增,求方案数。n×k≤1e6 l≤1e18
Solution:
DP,f[i][j]表示取了i次,最后一项取的位置是j的方案数,我们能迅速的想到一个转移方程:
发现暴力转移会T,考虑优化:
然后就写了2小时树状数组最后发现我写的方式无法查询TAT
经过机房神犇点拨(orz ckw),发现了每个新状态的转移是不受i的限制的,所以说我们可以把整个数组排序后用前缀和来优化转移。我们可以记录一个sum[i]表示转移到第i层后的答案和,设f[i]表示所选的最后一项的位置是i的方案数,那么
代码:
#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int n,k;long long l;int mod=1000000007;long long f[1000100];int sum[1000010];pair<int,int> p[1000100];int a[1000100],cnt;int ans=0;void plu(int &a,int b){ a=(1ll*a+b)%mod;}int main(){ scanf("%d%lld%d",&n,&l,&k); for (int i=0;i<n;i++) scanf("%d",&a[i]); for (int i=0;i<n*k;i++) p[i]=make_pair(a[i%n],i); sort(p,p+n*k); for (int i=0;i<n*k;i++) { if (p[i].second<n) f[p[i].second]=1; else f[p[i].second]=sum[p[i].second/n-1]; plu(sum[p[i].second/n],f[p[i].second]); if (p[i].second<l) { plu(ans,(1ll*f[p[i].second]*(((l-p[i].second-1)/n)%mod+1))%mod); } } printf("%d",ans);}
PS:终于会在markdown上写数学公式了QWQ
阅读全文
0 0
- Codeforces587B-DP+优化
- codeforces587B Duff in Beach
- HDU3507(dp + 斜率优化dp)
- pku1821 dp的优化
- DP(斜率优化)
- 【斜率优化DP】Batch_Scheduling
- dp优化--斜率
- DP 优化系列
- 斜率优化DP
- 斜率优化DP
- 单队优化DP
- hdu 四边形优化dp
- 单调队列优化DP
- 摩天楼 DP优化
- hdu3507斜率优化dp
- DP斜率优化总结
- hdu3480 斜率优化dp
- hdu2829 四边形优化dp
- pthread_cleanup_push与pthread_cleanup_pop的目的 作用
- 前端开发工具技巧介绍—Sublime篇
- 14-面向对象(接口和抽象类的区别)1 14-面向对象(接口和抽象类的区别)2 14-面向对象(接口和抽象类的区别)3
- PAT1061 判断题
- React JSX
- Codeforces587B-DP+优化
- 定时器机制及锁实现
- 深度学习————AI的进化之匙
- 实习项目回顾
- ubuntu 中文安装后需要卸载的中文字体
- 优先队列——A-B
- 在阿里云服务器(9.9学生版)上Cmake 构建Rosetta,并仅编译AbinitioRelax
- 6. ZigZag Conversion leetcode
- Windows编程基础--第8节 MFC对话框控件访问的七种方法(上)