题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709

题解:https://blog.csdn.net/neither_nor/article/details/53285115

每次选的段的两端种类相同。因为贡献有个数的二次方,所以对于 i ,更小的 j 的 [ j+1 , i ] 之间部分的贡献增长得更快。所以随着个数的增加,较小的 j 会越来越优于较大的 j ,就有决策单调性。

但是用指针的话,可能有下一个位置不优于这个位置,但下下个位置就优于这个位置的情况,用指针就走不过去了。

所以用这种单调栈+二分的方法。

就是用二分求一下栈里两个相邻元素,什么时候下一个元素会变得比这个元素更优(更优的时间指的是有几个“当前种类”的元素的时候下一个元素会更优(“下一个”是序列上更靠前的));新加入一个元素的时候,如果栈顶的下一个元素优于栈顶的时间早于栈顶优于新加入元素的时间,就把栈顶弹出(因为当栈顶优于当前元素的时候,栈顶下一个元素优于栈顶,所以栈顶下一个元素也优于当前元素;如果要弹掉当前元素,说明当前元素之后的元素优于当前元素,即栈顶优于当前元素,那么栈顶下一个元素此时也优于栈顶元素,所以会顺便把栈顶弹出,那么不如此时就把栈顶弹出,就能使得栈里相邻元素的“下一个优于上一个”的时间是单调递减的,就不会出现 i < j < k 且 i 优于 k 且 j 劣于 k 的情况了);加入之后如果栈顶下一个元素优于栈顶的时间在当前时间之前,就弹栈顶。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
#define tp sta[a[i]]
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int N=1e5+,M=1e4+;
int n,a[N],s[N],ct[M];ll dp[N];
vector<int> sta[M];
ll cal(int p,int sm)
{
sm=sm-s[p]+;
return dp[p-]+(ll)a[p]*sm*sm;
}
int cz(int u,int v)
{
int l=,r=n,ret=n+;//ret=n+1
while(l<=r)
{
int mid=l+r>>;
if(cal(u,mid)>=cal(v,mid))ret=mid,r=mid-;
else l=mid+;
}
return ret;
}
int main()
{
n=rdn();
for(int i=;i<=n;i++)
{ a[i]=rdn(); s[i]=++ct[a[i]];}
for(int i=;i<=n;i++)
{
while(tp.size()>=&&cz(tp[tp.size()-],tp[tp.size()-])<=cz(tp[tp.size()-],i))
tp.pop_back();
tp.push_back(i);
while(tp.size()>=&&cz(tp[tp.size()-],tp[tp.size()-])<=s[i])
tp.pop_back();
dp[i]=cal(tp[tp.size()-],s[i]);
}
printf("%lld\n",dp[n]);
return ;
}

bzoj 4709 [Jsoi2011]柠檬——单调栈二分处理决策单调性的更多相关文章

  1. bzoj 4709: [Jsoi2011]柠檬

    Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N ≤ 100,000) 只,按顺序串在树枝上.为了方便,我们从 ...

  2. bzoj 4709 [ Jsoi2011 ] 柠檬 —— 斜率优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709 课上讲的题,还是参考了博客...:https://www.cnblogs.com/GX ...

  3. bzoj 2216 [Poi2011]Lightning Conductor——单调队列+二分处理决策单调性

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2216 那个关于位置的代价是带根号的,所以随着距离的增加而增长变慢:所以靠后的位置一旦比靠前的 ...

  4. 【BZOJ】4709: [Jsoi2011]柠檬

    4709: [Jsoi2011]柠檬 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 779  Solved: 310[Submit][Status][ ...

  5. 4709: [Jsoi2011]柠檬

    4709: [Jsoi2011]柠檬 https://www.lydsy.com/JudgeOnline/problem.php?id=4709 分析: 决策单调性+栈+二分. 首先挖掘性质:每个段选 ...

  6. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  7. BZOJ1012最大数 [JSOI2008] 单调栈+二分

    正解:单调栈+二分查找(or,线段树? 解题报告: 拿的洛谷的链接quq 今天尝试学习了下单调栈,然后就看到有个博客安利了这个经典例题?于是就去做了,感觉还是帮助了理解趴quqqqqq 这题,首先,一 ...

  8. 51NOD 1962 区间计数 单调栈+二分 / 线段树+扫描线

     区间计数   基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80   两个数列 {An} , {Bn} ,请求出Ans, Ans定义如下: Ans:=Σni=1Σnj=i[max{ ...

  9. 【bzoj4237】稻草人 分治+单调栈+二分

    题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...

随机推荐

  1. Linux 安装最新版本python3

    新安装了Linux系统(CentOS 6),发现已安装的python版本是2.6. 在网上搜索研究之后总结了一下怎么在保留python2的同时安装最新版的python3. 1. 查看 Python 的 ...

  2. Linux:进程

    进程 一.简略操作 1.查看进程:ps2.查看进程资源占用量:top3.查看进程关系(进程树):pstree4.查看当前系统信息:uname -a 二.详细操作 1.查看进程:ps 2.查看进程资源占 ...

  3. dos命令:文件操作

    文件操作 一.assoc命令 1.介绍 显示或修改文件扩展名关联 2.语法 ASSOC [.ext[=[fileType]]] .ext     指定跟文件类型关联的文件扩展名 fileType 指定 ...

  4. centos下mysql数据迁移方法

    第一种: 原始数据库不需要重新安装: 默认mysql会安装在/var/lib/mysql这里,若将数据迁移到/data/mysql目录下,步骤如下: 1.停止mysql服务 2.#cp /var/li ...

  5. SQL拼接大法

    SQL拼接大法:          Step1:括号先写上() Step2:在括号内写上(,     ,     ,     ,      ,     ,) Step3:再写上单引号(,'     ' ...

  6. 常见无线DOS攻击

    记录下自己最近一段时间对无线渗透学习的笔记. 无线DOS就是无线拒绝服务攻击.主要包括以下几种攻击类型:Auth Dos攻击.Deauth Flood攻击.Disassociate攻击及RF干扰攻击等 ...

  7. 在Ubuntu上搭建IntelliJ IDEA license server服务器

    1.下载激活文件 2.ubuntu需要使用 IntelliJIDEALicenseServer_linux_amd64 ,把该文件传到服务器的某个目录,我是放在了/jideal 下 3.进入上面的目录 ...

  8. Quartz 原理

    Quartz API :http://www.quartz-scheduler.org/api/2.2.0/ http://www.boyunjian.com/javadoc/org.apache.s ...

  9. Makefile内置变量,递归式变量,直接展开式变量,条件赋值,追加赋值

    将shell命令的输出赋值给变量: VALUE = $(shell   命令) Makefile中给变量赋值: =     是递归展开式变量 value1 = 5 value2 = $(value1) ...

  10. python 实现图的深度优先和广度优先搜索

    在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...