bzoj4709 柠檬 单调栈,DP,斜率优化
/*
思路
s是值等于a[i]的前缀和
转移方程$f[i]=max(f[i],f[j-1]+a[i]*(s[i]-s[j]+1)*(s[i]-s[j]+1))$
不难写出暴力方程(by wxyww)
//@baoli
memset(f,-0x3f,sizeof(f));
f[0]=0;
for(int i=1;i<=n;++i) {
for(int j=1;j<=i;++j) {
if(a[i]==a[j]) {
f[i]=max(f[i],f[j-1]+a[i]*(s[i]-s[j]+1)*(s[i]-s[j]+1));
}
}
}
关于此题的单调性
特性1
每一段分出来的都一定是两端相同的,显然
特性2
他满足斜率单调,也就是要维护凸包
ll X(int i) {return 2LL*a[i]*s[i];}
ll Y(int i) {return f[i-1]+1LL*a[i]*s[i]*s[i]-2LL*a[i]*s[i];}
特性3
如果\(j<k\)且\(f_{j-1}+a{i}*(s{i}-s{j}+1)^2 > f{k-1}+a{i}*(s{i}-s{k}+1)^2\)
显然,f和s都是单增的
那么对于i以后的点都是j决策大于k决策
为何?显然(我只能这样说),大概可以理解为\(s{i}-s{j}\)的变化量比\(s{i}-s{k}\)大0
总结思路,把他们用栈一起维护起来就是了?
错误
全程懵逼
代码
#include <cstdio>
#include <vector>
#define ll long long
using namespace std;
const int N=1e5+7;
int n,a[N],s[N],vis[N],top[N];
ll f[N];
vector<int> q[N];
ll X(int i) {return 2LL*a[i]*s[i];}
ll Y(int i) {return f[i-1]+1LL*a[i]*s[i]*s[i]-2LL*a[i]*s[i];}
long double calc(int j,int k) {return (Y(k)-Y(j))/(long double)(X(k)-X(j));}
ll dp(int i,int j) {return f[j-1]+(ll)a[i]*(s[i]-s[j]+1)*(s[i]-s[j]+1);}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]),s[i]=++vis[a[i]];
for(int i=1;i<=n;++i) if(!q[a[i]].size()) q[a[i]].push_back(0);
for(int i=1;i<=n;++i) {
ll p=a[i];
while(top[p]>1 && calc(q[p][top[p]],q[p][top[p]-1]) <= calc(q[p][top[p]],i))
top[p]--,q[p].pop_back();
top[p]++;q[p].push_back(i);
while(top[p]>1 && calc(q[p][top[p]],q[p][top[p]-1]) <= s[i])
top[p]--,q[p].pop_back();
f[i]=dp(i,q[p][top[p]]);
}
printf("%lld\n", f[n]);
return 0;
}
bzoj4709 柠檬 单调栈,DP,斜率优化的更多相关文章
- LOJ #2769 -「ROI 2017 Day 1」前往大都会(单调栈维护斜率优化)
LOJ 题面传送门 orz 斜率优化-- 模拟赛时被这题送走了,所以来写篇题解( 首先这个最短路的求法是 trivial 的,直接一遍 dijkstra 即可( 重点在于怎样求第二问.注意到这个第二问 ...
- 洛谷 P4697 Balloons [CEOI2011] 单调栈/dp (待补充qwq)
正解:单调栈/dp 解题报告: 先放个传送门qwq 话说这题是放在了dp的题单里呢?但是听说好像用单调栈就可以做掉所以我就落实下单调栈的解法好了qwq (umm主要如果dp做好像是要斜率优化凸壳维护双 ...
- 【BZOJ-1010】玩具装箱toy DP + 斜率优化
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8432 Solved: 3338[Submit][St ...
- APIO2010特别行动队(单调队列、斜率优化)
其实这题一看知道应该是DP,再一看数据范围肯定就是单调队列了. 不过我还不太懂神马单调队列.斜率优化…… 附上天牛的题解:http://www.cnblogs.com/neverforget/arch ...
- 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)
http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...
- DP斜率优化总结
目录 DP斜率优化总结 任务安排1 任务计划2 任务安排3 百日旅行 DP斜率优化总结 任务安排1 首先引入一道题,先\(O(N^2)\)做法:分别预处理出\(T_i,C_i\)前缀和\(t[i],c ...
- HDU 3507 [Print Article]DP斜率优化
题目大意 给定一个长度为\(n(n \leqslant 500000)\)的数列,将其分割为连续的若干份,使得 $ \sum ((\sum_{i=j}^kC_i) +M) $ 最小.其中\(C_i\) ...
- dp斜率优化
算法-dp斜率优化 前置知识: 凸包 斜率优化很玄学,凭空讲怎么也讲不好,所以放例题. [APIO2014]序列分割 [APIO2014]序列分割 给你一个长度为 \(n\) 的序列 \(a_1,a_ ...
- 【BZOJ-4518】征途 DP + 斜率优化
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 230 Solved: 156[Submit][Status][ ...
随机推荐
- 一 js数据类型
一.简单的数据对象 ------1.小数 var fNum = 1.02; ------2.整数 var iNum = 1; ------3.逻辑变量 var bNum = true; 二.复杂的数据 ...
- repr()函数
http://www.cnblogs.com/itdyb/p/5046415.html
- 深度解读 AlphaGo 算法原理
http://blog.csdn.net/songrotek/article/details/51065143 http://blog.csdn.net/dinosoft/article/detail ...
- Java基础(basis)-----关键字this和super的作用
1.关键字this 可以用来修饰属性.方法.构造器:this理解为当前对象或当前正在创建的对象 局部变量与成员变量同名,成员变量被屏蔽,用"this.成员变量"的方式访问成员变量 ...
- MVC 下拉列表三级联动
当前所做的项目,关于数据库设计的时候有点小意思,表A是三个联合主键,key1,key2,key3,表B是四个联合主键 key1,key2,key3,key4,其中表B的联合外键关联表A对应的联合主键, ...
- 【Hive学习之六】Hive Lateral View &视图&索引
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...
- tiny4412 硬件解码
今天发现了一个好的资源,上面有三星的一些实例代码.http://git.infradead.org/users/kmpark/public-apps
- AlphaGo设计师黄士杰:“最强的学习技能在人类的脑袋里”
AlphaGo设计师黄士杰:“最强的学习技能在人类的脑袋里” 深度学习和强化学习结合看来才能解决彩票预测的问题 可以这么说,AlphaGo的成功就是深度学习与强化学习的胜利,因为两者结合在一起,建构判 ...
- LUHN 模10 算法 银行卡校验
信用卡Luhn算法(模10)具体的校验过程如下: 1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加. 2.从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去 ...
- <转>jmeter(八)断言
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...