【CF889E】Mod Mod Mod DP
【CF889E】Mod Mod Mod
题意:给你一个序列$a_1,a_2...a_n$,定义$f(x,n)=x\mod a_n$,$f(x,i)=x\mod a_i+f(x \mod a_i,i+1) (1 \le i<n)$。
最大化f(x,1)。
$n\le 200000,a_i\le 10^9$
题解:超级神的DP题。(题目名字好暴力啊~)
首先有一个性质,一个数对一个比它小的数取模,最多取log次就会变成0。我们思考如何利用这个性质。
如果我们令f[x][i]就是题目中的f(x,i),那么每次i++的时候我们都要更新所有的dp值。不过我们可以将答案变成i*x+b的形式,那么f[d][i]就代表当x<=d时,最大的b值。这也就是说,我们dp维护的其实使若干条线段,我们要在斜率一定的时候,最大化截距。
思考如何转移,我们从f[d][i]可以转移到$f[d \mod a_i][i+1]$,也可以转移到$f[a_i-1][i+1]$(前提:ai<=d)。我们发现我们可以将所有$f[a_i-1][i+1]$合并,并且对于d<ai的状态,dp值并不改变,我们可以不理会这些状态。所以时间复杂度是多少呢?
上面已经说过了,一个数我们只在它被取模的时候更新状态,并且每次我们只新加入一个数ai-1,所以最终复杂度是$O(n\log n)$的。
当然,如果你像我一样比较懒用map维护dp值,需要再加一个log。
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=200010;
typedef long long ll;
ll n,ans,v;
map<ll,ll> f;
map<ll,ll>::iterator it;
inline ll rd()
{
ll ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
n=rd();
ll i,a,b;
f[rd()-1]=0;
for(i=2;i<=n;i++)
{
v=rd();
while(f.begin()!=f.end())
{
it=f.end(),it--,a=(*it).first,b=(*it).second;
if(a<v) break;
f[v-1]=max(f[v-1],b+(i-1)*(a-a%v-v));
f[a%v]=max(f[a%v],b+(i-1)*(a-a%v));
f.erase(it);
}
}
for(it=f.begin();it!=f.end();it++) ans=max(ans,n*((*it).first)+(*it).second);
printf("%I64d",ans);
return 0;
}
【CF889E】Mod Mod Mod DP的更多相关文章
- 【模板】exBSGS/Spoj3105 Mod
[模板]exBSGS/Spoj3105 Mod 题目描述 已知数\(a,p,b\),求满足\(a^x\equiv b \pmod p\)的最小自然数\(x\). 输入输出格式 输入格式: 每个测试文件 ...
- 【题解】NOIP2017逛公园(DP)
[题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...
- 【题解】284E. Coin Troubles(dp+图论建模)
[题解]284E. Coin Troubles(dp+图论建模) 题意就是要你跑一个完全背包,但是要求背包的方案中有个数相对大小的限制 考虑一个\(c_i<c_j\)的限制,就是一个\(c_i\ ...
- 【BZOJ4712】洪水(动态dp)
[BZOJ4712]洪水(动态dp) 题面 BZOJ 然而是权限题QwQ,所以粘过来算了. Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开 ...
- 【题解】Jury Compromise(链表+DP)
[题解]Jury Compromise(链表+DP) 传送门 题目大意 给你\(n\le 200\)个元素,一个元素有两个特征值,\(c_i\)和\(d_i\),\(c,d \in [0,20]\), ...
- 【题解】Making The Grade(DP+结论)
[题解]Making The Grade(DP+结论) VJ:Making the Grade HNOI-D2-T3 原题,禁赛三年. 或许是我做过的最简单的DP题了吧(一遍过是什么东西) 之前做过关 ...
- 【BZOJ】2310: ParkII 插头DP
[题意]给定m*n的整数矩阵,求经过所有点至多一次路径的最大数值和.n<=8,m<=100. [算法]插头DP [题解]最小表示法确实十分通用,处理简单路径问题只需要状态多加一位表示独立插 ...
- 【BZOJ4818】[Sdoi2017]序列计数 DP+矩阵乘法
[BZOJ4818][Sdoi2017]序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ,这n个数 ...
- 【BZOJ3864】Hero meet devil DP套DP
[BZOJ3864]Hero meet devil Description There is an old country and the king fell in love with a devil ...
随机推荐
- Thinkphp5笔记三:创建基类
做项目之前,一定要先部署要自己的"基类",非常的重要.打个比方,要访问会员中心相关的控制器,这类控制器是不是都要有一个“登录限制”,才让访问会员相关的控制器? 一.创建三大基类 原 ...
- 举例理解Hibernate的三种状态
初学Hibernate,了解到Hibernate有三种状态:transient(瞬时状态),persistent(持久化状态)以及detached(游离状态). 它们之间有如下转换图来说明: 1.tr ...
- ng-bind-html-unsafe的替代
angular 1.2以后(或更早?)移除了ng-bind-html-unsafe,那么我要用这个directive来绑定html代码怎么办?随便一测试,它是不支持把html直接传给它的: //htm ...
- spring数据连接池配置参数
1.使用jdbc连接,每次使用完毕需要关闭连接. 2.使用数据库连接池就会方便很多,但是如果参数配置不对,也会引起mysql连接数不够,导致mysql挂掉,基本原理是:不使用的连接数及时回收回来,而不 ...
- centos7系统下nginx安装并配置开机自启动操作
准备工作 我的centos7系统是最小化安装的, 缺很多库, 首先安装必须的运行库 ? 1 2 3 4 5 6 7 8 9 10 11 yum install wget gcc gcc-c++ pcr ...
- mysql中已经存在某个库中有大小写的表,将lower_case_table_names由0改为1对已经存在的表是否有影响?
需求描述: 今天遇到了修改lower_case_table_names参数的问题,想了下,如果原来里面有表,表名有大小写的, 如果将lower_case_table_names从默认的0改为1之后,那 ...
- linux中高亮显示文本的工具 -- bat
bat 的项目地址 https://github.com/sharkdp/bat bat 是用rust 开发的, 在centos中安装bat需要rust的环境, 我们可以通过安装rust的包管理工具c ...
- selenium +chrome headless Manual 模式渲染网页
可以看看这个里面的介绍,写得很好.https://duo.com/blog/driving-headless-chrome-with-python from selenium import webdr ...
- Elastic-Job原理分析(version:2.1.4)
当当的Elastic-Job开源出了两种分布式Job的解决方案:1. elastic-job-lite,这是一个无中心节点的调度: Elastic-Job-Lite定位为轻量级无中心化解决方案,使用j ...
- hadoop JOB的性能优化实践
使用了几个月的hadoopMR,对遇到过的性能问题做点笔记,这里只涉及job的性能优化,没有接触到 hadoop集群,操作系统,任务调度策略这些方面的问题. hadoop MR在做大数据量分析时候有限 ...