[BZOJ4709][JSOI2011]柠檬 决策单调性优化dp
题解:
解法1:
单调栈优化
首先发现一个性质就是
如果当前从i转移比从j转移更加优秀
那么之后就不会从j转移
所以我们考虑利用这个性质
我们要维护一个队列保证前一个超过后一个的时间单调不减
怎么来维护呢
我们计算s[t-2]超过s[t-1]的时间t1,s[t-1]超过i的时间t2,如果t1<t2就说明了s[t-1]没有用了
另外再更新的时候我们算一下相邻两个哪个比较有用,要是前面哪个就弹栈
解法2:
f[i]=max(f[j−1]+a[j]×(s[i]−s[j]+1)^2)
我们先尝试一下一般的斜率优化,会发现是不行的
因为会出现s[i]^2和s[i]两项
我们转化一下这个式子
f[j−1]+(s[j]−1)2∗color=2∗s[i]∗color∗(s[j]−1)+f[i]−s[i]∗v[i]
把左边看成y,右边(s[j]-1)看成y,2*s[i]*color看成系数,后面的看成b
问题就变成了一条直线切割的b最大
显然凸包维护就可以了
代码:
#include <bits/stdc++.h>
using namespace std;
#define IL inline
#define ll long long
#define rint register int
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define me(x) memset(x,0,sizeof(x))
const int INF=1e9;
const int N=2e5+;
int n;
ll f[N];
vector<int> g[N];
int s[N],a[N],cnt[N];
IL ll calc(int x,int y)
{
return f[x-]+1ll*a[x]*y*y;
}
IL int find(int x,int y)
{
int h=max(s[x],s[y]),t=n;
while(h<t)
{
int mid=(h+t)/;
if (calc(x,mid-s[x]+)>=calc(y,mid-s[y]+)) t=mid;
else h=mid+;
}
return(h);
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n;
rep(i,,n)
{
int x;
cin>>x;
a[i]=x; s[i]=++cnt[x];
int k1=g[x].size();
while (k1>=&&find(g[x][k1-],g[x][k1-])<=find(g[x][k1-],i))
g[x].pop_back(),k1--;
g[x].push_back(i); k1++;
while (k1>=&&find(g[x][k1-],g[x][k1-])<=s[i]) g[x].pop_back(),k1--;
f[i]=calc(g[x][k1-],s[i]-s[g[x][k1-]]+);
}
cout<<f[n];
return ;
}
[BZOJ4709][JSOI2011]柠檬 决策单调性优化dp的更多相关文章
- BZOJ4709: [Jsoi2011]柠檬(决策单调性)
题意 题目链接 Sol 结论:每次选择的区间一定满足首位元素相同.. 仔细想想其实挺显然的,如果不相同可以删掉多着的元素,对答案的贡献是相同的 那么设\(f[i]\)表示到第\(i\)个位置的最大价值 ...
- 决策单调性优化dp 专题练习
决策单调性优化dp 专题练习 优化方法总结 一.斜率优化 对于形如 \(dp[i]=dp[j]+(i-j)*(i-j)\)类型的转移方程,维护一个上凸包或者下凸包,找到切点快速求解 技法: 1.单调队 ...
- Lightning Conductor 洛谷P3515 决策单调性优化DP
遇见的第一道决策单调性优化DP,虽然看了题解,但是新技能√,很开森. 先%FlashHu大佬,反正我是看了他的题解和精美的配图才明白的,%%%巨佬. 废话不多说,看题: 题目大意 已知一个长度为n的序 ...
- CF868F Yet Another Minimization Problem 分治决策单调性优化DP
题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...
- 2018.09.28 bzoj1563: [NOI2009]诗人小G(决策单调性优化dp)
传送门 决策单调性优化dp板子题. 感觉队列的写法比栈好写. 所谓决策单调性优化就是每次状态转移的决策都是在向前单调递增的. 所以我们用一个记录三元组(l,r,id)(l,r,id)(l,r,id)的 ...
- [BZOJ4850][JSOI2016]灯塔(分块/决策单调性优化DP)
第一种方法是决策单调性优化DP. 决策单调性是指,设i>j,若在某个位置x(x>i)上,决策i比决策j优,那么在x以后的位置上i都一定比j优. 根号函数是一个典型的具有决策单调性的函数,由 ...
- BZOJ2216 Poi2011 Lightning Conductor 【决策单调性优化DP】
Description 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt( ...
- BZOJ4899: 记忆的轮廓【概率期望DP】【决策单调性优化DP】
Description 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...
- 2018.10.14 NOIP训练 猜数游戏(决策单调性优化dp)
传送门 一道神奇的dp题. 这题的决策单调性优化跟普通的不同. 首先发现这道题只跟r−lr-lr−l有关. 然后定义状态f[i][j]f[i][j]f[i][j]表示猜范围为[L,L+i−1][L,L ...
随机推荐
- MATLAB GUI对话框设计
原文地址:http://blog.csdn.net/shuziluoji1988/article/details/8532982 1.公共对话框: 公共对话框是利用windows资源的对话框,包括文件 ...
- java 批量插入 Oracle
sql = "INSERT INTO LOG_FILENAME(ID,FILENAME,CREATETIME) VALUES(2,?,sysdate)"; public void ...
- css3 弹性效果上下翻转demo
最近扒了一个有弹性效果上下翻转demo 上图: 上代码: <!DOCTYPE html> <html lang="en"> <head> < ...
- c 中打印格式%g
C语言中打印float或double类型最常用的是%f格式,最近看书时看到有使用%g格式打印. %f 表示按浮点数的格式打印. 小数点后固定6位 %e 表示以指数形式的浮点数格式输出. %g 表示自 ...
- 利用表格分页显示数据的js组件bootstrap datatable的使用
前面展示了datatable的简单使用,还可以通过bootstrap结合datatable来使用,这样可以进一步美化datatable插件 <!DOCTYPE html> <html ...
- Eclipse中三种设置编码格式的方法
转自:https://blog.csdn.net/rainy_black_dog/article/details/52403735 很早以前听过一位老师说过:咱们中国人不管学习哪种编程语言,总会遇到乱 ...
- java使用spark/spark-sql处理schema数据
1.spark是什么? Spark是基于内存计算的大数据并行计算框架. 1.1 Spark基于内存计算 相比于MapReduce基于IO计算,提高了在大数据环境下数据处理的实时性. 1.2 高容错性和 ...
- liunx 安装jdk1.8
采用解压压缩文件形式安装 第一步:将jdk压缩文件上传至home目录下面 第二步:目录切换至/usr目录下 cd /usr 创建java目录 mkdir java 第三步:将jdk 压缩文 ...
- 快速开发android,离不开这10个优秀的开源项目
作为一名菜鸡Android,时常瞻仰大佬们的开源项目是非常必要的.这里我为大家收集整理了10个优秀的开源项目,方便我们日常开发中学习! 作者:ListenToCode博客:https://www.ji ...
- 什么是java序列化,如何实现java 序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化. 可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序列化是为了解决在对对象流进行读写操作时所引发的问题. ...