题目: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. L246‘’

    Should English classes be compulsory at the elementary or primary school level in countries where it ...

  2. 记一次ios加急上架经历

    https://developer.apple.com//contact/app-store/?topic=expedite app迭代版本上架之前一直好好的没报错,没crash,但是有一次加急上架, ...

  3. python 一行代码字符串转字典方法

    b = 'bid=Qzw9cKnyESM; ll="108288"; __yadk_uid=4YChvgeANLBEh4iV00n1tc0HQ8zpmSl1; __utmc=301 ...

  4. java学习笔记30(IO :缓冲流)

    缓冲流: 读取数据大量的文件时,读取的速度慢,java提供了一套缓冲流,提高IO流的效率: 缓冲流分为字节缓冲流和字符缓冲流: 字节输入缓冲流和字节输出缓冲流如下: package com.zs.De ...

  5. 2--JAVA+Maven+TestNG搭建接口测试框架搭建

    1.配置JDK 2.安装Eclipse以及TestNG Eclipse下载地址:http://beust.com/eclipse TestNG安装过程:输入网址:http://beust.com/ec ...

  6. 运行和管理Rabbit

    节点描述的是一个Erlang节点运行着一个Erlang应用程序.Erlang虚拟机的每个实例我们称之为节点.多个Erlang应用程序可以运行在同一个节点之上.节点之间可以进行本地通信.在RabbitM ...

  7. MySQL笔记(1)

    数据库和 SQL 概念 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它的产生距今已有六十多年.随着信息技术和市场的发展,数据库变得无处不在:它在电子商务.银行系统 等众多领域 ...

  8. C# process 隐藏应用程序的进度条

    命令行参数那加上-ibck指定后台运行. string sourceFilepath = "d:\\测试.rar"; string targetFilepath = "d ...

  9. Python学习笔记第十八周

    目录: 一.JavaScript正则表达式 1.test  2.exec 二.BootStrap  1.响应式  2.图标.字体  3.基本使用 三.Django 1.安装  2.创建目录  3.进入 ...

  10. C#线程、前后台线程

    C#线程.前后台线程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创新 ...