/*

思路

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,斜率优化的更多相关文章

  1. LOJ #2769 -「ROI 2017 Day 1」前往大都会(单调栈维护斜率优化)

    LOJ 题面传送门 orz 斜率优化-- 模拟赛时被这题送走了,所以来写篇题解( 首先这个最短路的求法是 trivial 的,直接一遍 dijkstra 即可( 重点在于怎样求第二问.注意到这个第二问 ...

  2. 洛谷 P4697 Balloons [CEOI2011] 单调栈/dp (待补充qwq)

    正解:单调栈/dp 解题报告: 先放个传送门qwq 话说这题是放在了dp的题单里呢?但是听说好像用单调栈就可以做掉所以我就落实下单调栈的解法好了qwq (umm主要如果dp做好像是要斜率优化凸壳维护双 ...

  3. 【BZOJ-1010】玩具装箱toy DP + 斜率优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][St ...

  4. APIO2010特别行动队(单调队列、斜率优化)

    其实这题一看知道应该是DP,再一看数据范围肯定就是单调队列了. 不过我还不太懂神马单调队列.斜率优化…… 附上天牛的题解:http://www.cnblogs.com/neverforget/arch ...

  5. 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...

  6. DP斜率优化总结

    目录 DP斜率优化总结 任务安排1 任务计划2 任务安排3 百日旅行 DP斜率优化总结 任务安排1 首先引入一道题,先\(O(N^2)\)做法:分别预处理出\(T_i,C_i\)前缀和\(t[i],c ...

  7. HDU 3507 [Print Article]DP斜率优化

    题目大意 给定一个长度为\(n(n \leqslant 500000)\)的数列,将其分割为连续的若干份,使得 $ \sum ((\sum_{i=j}^kC_i) +M) $ 最小.其中\(C_i\) ...

  8. dp斜率优化

    算法-dp斜率优化 前置知识: 凸包 斜率优化很玄学,凭空讲怎么也讲不好,所以放例题. [APIO2014]序列分割 [APIO2014]序列分割 给你一个长度为 \(n\) 的序列 \(a_1,a_ ...

  9. 【BZOJ-4518】征途 DP + 斜率优化

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 230  Solved: 156[Submit][Status][ ...

随机推荐

  1. 记dynamic的一个小坑 -- RuntimeBinderException:“object”未包含“xxx”的定义

    from:http://blog.csdn.net/feiyun0112/article/details/39697955 创建一个控制台程序和一个类库, 在控制台创建一个匿名对象,然后再在类库中访问 ...

  2. Spring的quartz定时器重复执行二次的问题解决

    Spring的quartz定时器同一时刻重复执行二次的问题解决 最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的ha ...

  3. clear/reset select2,重置select2,恢复默认

    4.0 version //方法一$('#yourButton').on('click', function() { $('#yourfirstSelect2').val(null).trigger( ...

  4. 10.for

    要遍历一个范围(如数组或表),使用 for 循环.在数组上迭代时,当前数组元素存储在循环变量中.在遍历字典时, index 存储在循环变量中. (in 内容测试) for x in [5, 7, 11 ...

  5. 如何在Sitecore CMS中打开内容编辑器

    在Sitecore中开发网站时,大多数项目管理都来自内容编辑器.创建,删除,修改,移动,发布,排序和查看项目只是可以在Content Editor界面中处理的众多任务中的一小部分. 由于内容编辑器对于 ...

  6. Sitecore系统教程之模板理解

    Sitecore中的所有内容都是一个项目.模板也是如此.Sitecore中的模板是一个项目,它定义了其他项目的结构和行为.Sitecore中的每个项目都是某个模板的实例.模板还可以定义它分解成的部分和 ...

  7. 虚拟机连不上网 Xshell连不上虚拟机

    以centos7 为例 1,确定network connection 为NAT 2, 打开网络连接中心 Control Panel\Network and Internet\Network Conne ...

  8. flask 处理表单数据

    处理表单数据 表单数据的处理涉及很多内容,从获取数据到保存数据大致有以下步骤: 1.  解析请求,获取表单数据 2.  对数据进行必要的转换,比如讲勾选框的值转换成python的布尔值 3.  验证数 ...

  9. seo网页加速技术,预加载 DNS Prefetching 详解

    seo网页加速技术,预加载 DNS Prefetching 详解 DNS Prefetching 是什么 : DNS 是什么-- Domain Name System,域名系统,作为域名和IP地址相互 ...

  10. Hinton“深度学习之父”和“神经网络先驱”,新论文Capsule将推翻自己积累了30年的学术成果时

    Hinton“深度学习之父”和“神经网络先驱”,新论文Capsule将推翻自己积累了30年的学术成果时 在论文中,Capsule被Hinton大神定义为这样一组神经元:其活动向量所表示的是特定实体类型 ...