【bzoj4709】[Jsoi2011]柠檬 决策单调性+dp
Description
Flute 很喜欢柠檬。它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬。贝壳一共有 N (1 ≤ N
≤ 100,000) 只,按顺序串在树枝上。为了方便,我们从左到右给贝壳编号 1..N。每只贝壳的大小不一定相同,
贝壳 i 的大小为 si(1 ≤ si ≤10,000)。变柠檬的魔法要求,Flute 每次从树枝一端取下一小段连续的贝壳,并
选择一种贝壳的大小 s0。如果 这一小段贝壳中 大小为 s0 的贝壳有 t 只,那么魔法可以把这一小段贝壳变成 s
0t^2 只柠檬。Flute 可以取任意多次贝壳,直到树枝上的贝壳被全部取完。各个小段中,Flute 选择的贝壳大小 s
0 可以不同。而最终 Flute 得到的柠檬数,就是所有小段柠檬数的总和。Flute 想知道,它最多能用这一串贝壳
变出多少柠檬。请你帮忙解决这个问题。
Input
第 1 行:一个整数,表示 N。
第 2 .. N + 1 行:每行一个整数,第 i + 1 行表示 si。
Output
仅一个整数,表示 Flute 最多能得到的柠檬数。
Sample Input
5
2
2
5
2
3
Sample Output
21
//Flute 先从左端取下 4 只贝壳,它们的大小为 2, 2, 5, 2。选择 s0 = 2,那么这一段
里有 3 只大小为 s0 的贝壳,通过魔法可以得到 2×3^2 = 18 只柠檬。再从右端取下最后一
只贝壳,通过魔法可以得到 1×3^1 = 3 只柠檬。总共可以得到 18 + 3 = 21 只柠檬。没有
比这更优的方案了。
Sol
显然题目转化为序列分割问题,而且每个分出来的序列首尾肯定相同(否则去掉之后这一段贡献不变,产生了新的段使得最终答案更大),所以我们得到普及组dp:
令\(f[i]\)表示前i位的最大价值,那么:\(f[i]=f[j-1]+a[j]*(s[i]-s[j]+1)^2\),s[i]代表前i个数里a[i]出现的次数 。
tle,考虑优化。我们发现后面那个平方随着i的上升它是单调不降的,所以我们对于每个权值开个单调栈保存当前最优解的j,然后用栈顶更新即可。
每次要入栈之前,如果栈底第二个元素f值已经大于栈顶了,说明栈顶没用了,就弹出直到栈顶大于栈顶第二个元素的贡献为止。但是可能出现后面的超过栈顶但是第二个元素没超过的情况,所以我们在每次入栈之前,要先判断第二个元素和第一个元素超过当前i的时间,如果第二个超过时间比第一个早,弹出栈顶直到情况改变为止。
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll f[100010];int n,a[100010];int cnt[100010],s[100010];vector<int>q[10010];
ll cal(int x,int y){return f[x-1]+(ll)a[x]*y*y;}
int sol(int x,int y)
{
int l=1,r=n,ret=n+1;
while(l<=r)
{
int mid=l+r>>1;
if(cal(x,mid-s[x]+1)>=cal(y,mid-s[y]+1)) ret=mid,r=mid-1;
else l=mid+1;
}
return ret;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);a[i]=x;s[i]=++cnt[x];
while(q[x].size()>=2&&sol(q[x][q[x].size()-2],q[x][q[x].size()-1])<=sol(q[x][q[x].size()-1],i)) q[x].pop_back();
q[x].push_back(i);
while(q[x].size()>=2&&sol(q[x][q[x].size()-2],q[x][q[x].size()-1])<=s[i]) q[x].pop_back();
f[i]=cal(q[x][q[x].size()-1],s[i]-s[q[x][q[x].size()-1]]+1);
}
printf("%lld\n",f[n]);
}
【bzoj4709】[Jsoi2011]柠檬 决策单调性+dp的更多相关文章
- [BZOJ4709][JSOI2011]柠檬 决策单调性优化dp
题解: 解法1: 单调栈优化 首先发现一个性质就是 如果当前从i转移比从j转移更加优秀 那么之后就不会从j转移 所以我们考虑利用这个性质 我们要维护一个队列保证前一个超过后一个的时间单调不减 怎么来维 ...
- BZOJ4709: [Jsoi2011]柠檬(决策单调性)
题意 题目链接 Sol 结论:每次选择的区间一定满足首位元素相同.. 仔细想想其实挺显然的,如果不相同可以删掉多着的元素,对答案的贡献是相同的 那么设\(f[i]\)表示到第\(i\)个位置的最大价值 ...
- [BZOJ4709][JSOI2011]柠檬(斜率优化DP)
显然选出的每一段首尾都是相同的,于是直接斜率优化,给每个颜色的数开一个单调栈即可. #include<cstdio> #include<vector> #include< ...
- bzoj4709: [Jsoi2011]柠檬 斜率优化
题目链接 bzoj4709: [Jsoi2011]柠檬 题解 斜率优化 设 \(f[i]\) 表示前 \(i\)个数分成若干段的最大总价值. 对于分成的每一段,左端点的数.右端点的数.选择的数一定是相 ...
- BZOJ4426 :最大生产率(贪心+决策单调性DP)
题意:给出N个人,现在让你分P组,每组的工作效率是最小结束时间-最大开始时间,要求每一组的效率的正数,求最大效率和.N<1000 思路: 把包含至少一个其他的分到A组:否则到B组. A组的要么单 ...
- CF321E Ciel and Gondolas 【决策单调性dp】
题目链接 CF321E 题解 题意:将\(n\)个人分成\(K\)段,每段的人两两之间产生代价,求最小代价和 容易设\(f[k][i]\)表示前\(i\)个人分成\(k\)段的最小代价和 设\(val ...
- BZOJ2216 [Poi2011]Lightning Conductor 【决策单调性dp】
题目链接 BZOJ2216 题解 学过高中数学都应知道,我们要求\(p\)的极值,参变分离为 \[h_j + sqrt{|i - j|} - h_i \le p\] 实际上就是求\(h_j + sqr ...
- 洛谷 P3515 [ POI 2011 ] Lightning Conductor —— 决策单调性DP
题目:https://www.luogu.org/problemnew/show/P3515 决策单调性... 参考TJ:https://www.cnblogs.com/CQzhangyu/p/725 ...
- LOJ2074/2157 JSOI2016/POI2011 Lightning Conductor 决策单调性DP
传送门 我们相当于要求出\(f_i = \max\limits_{j=1}^{n} (a_j + \sqrt{|i-j|})\).这个绝对值太烦人了,考虑对于\(i>j\)和\(i<j\) ...
随机推荐
- pycharm的自定义python模板
#!/usr/bin/env python # encoding: utf-8 #set( $SITE = "http://blog.csdn.net/morgana" ) &qu ...
- 02-25 类成员的访问权限--internal
C#中还有一种可访问性,就是由关键字internal所确定的“内部”访问性: internal有点像public,外界类也可以直接访问声明为internal的类或类的成员,但这只局限于同一个程序集内部 ...
- 19-从零玩转JavaWeb-继承关系与方法覆盖
配套视频详解 继承子类与父类的关系 继承子类与父类的关系代码演示 继承方法的覆盖 方法覆盖原则 一.继承编写过程 二.子类可以继承父类当中哪些内容 可以自行把修饰符换下, 然后查看子类能不能访问 ...
- git配置和使用
1.注册bitbucket用户登录bitbucket站点https://bitbucket.org/注册一个用户,注册后用户名为linjiqin,邮箱为linjiqin@dkhs.com. 2.Cre ...
- Python父类调用子类
首先说明,上面的标题其实是不正确的,Python是一门解释型.动态数据类型的高级语言,运行时,动态判断调用对象,其实还是子类自己在调用自己的方法或属性. 举个例子(copy过来的):SocketSer ...
- 关于recv的返回值
通常recv有几种返回值 1.==0 表示收到FIN包, 因为FIN包,是状态为标记为FIN的空包,没有携带数据,所以recv的长度为0 2.>0 表示收到了数据, 但是有没有收完,是不知道的 ...
- mongo状态查看方法
列举一些常用的mongodb状态查看方法. 1.mongostat 是mongdb自带的状态检测工具, inserts/s 每秒插入次数 query/s 每秒查询次数 update/s 每秒更新次数 ...
- Flask框架 之 wtforms
简介 WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 作用 生成HTML标签 form表单验证 使用 - 用户登录示例- 用户注册示例- 数据库获取数据实时更新 ...
- jquery dropdownlist.js
$.fn.extend({ SetDict: function (option) { var txtControl = $(this); if (!txtControl.hasClass(" ...
- 网页中的foot底部定位问题
有时候,我们会碰到这样一个问题. 网页底部一般有个foot对吧,放置一些友情链接版权声明什么的,这个模块是如何定位的? 要是直接放内容区域的下面的话,假如是内容区域的高度不够的话,那么foot下面是会 ...