题目: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. Jmeter监听tomcat

    配置cd /usr/local/tomcat/conf/tomcat-users.xml

  2. POJ 2409 Let it Bead(polya裸题)

    题目传送:http://poj.org/problem?id=2409 Description "Let it Bead" company is located upstairs ...

  3. 【Maven】Project configuration is not up-to-date with pom.xml错误解决方法

    导入一个Maven项目之后发现有一个如下的错误: Project configuration is not up-to-date with pom.xml. Run project configura ...

  4. ES6 声明变量的6种方法

    ES5 只有两种声明变量的方法:var命令和function命令. ES6除了添加let和const命令,后面章节还会提到,另外两种声明变量的方法:import命令和class命令.所以,ES6 一共 ...

  5. Python学习笔记第二十二周(前端知识点补充)

    目录: 一.伪类 二.样式 1.字体 2.背景图片 3.margin和padding 4.列表属性 5.float 6.clear 7.position 8.text-decoration(a标签下划 ...

  6. 通过修改源码,免插件实现wordpress去除链接中的category

    将以下代码加在主题目录的functions.php /** * 去除category */ add_action('load-themes.php', 'no_category_base_refres ...

  7. builder模式-积木系列

    代码高效的表达意图,是优秀代码的基本标准,所以在刚刚写代码的时候我们总是被教育方法的名字,变量字段的名字要尽可能表达出在程序中的含义. 在<重构和模式>中提到的creation,就是讲构造 ...

  8. 将scrapy项目运行在pycharm中

    1.在scrapy项目中创建一个py脚本,且尽量在scrapy.cfg同级目录下.我创建的是begin.py 2.配置begin.py.写上这一句就相等于一点开始,就在终端上输入了scrapy cra ...

  9. lecture1-Word2vec实战班-七月在线nlp

    nltk的全称是natural language toolkit,是一套基于python的自然语言处理工具集.自带语料库.词性分类库.自带分类分词等功能.强大社区支持.很多简单版wrapper 文本处 ...

  10. 配置url防盗链、目录权限访问控制Directory、文件访问权限控制FilesMatch

    1.配置url防盗链: 编辑:/usr/local/apache2.4/conf/extra/httpd-vhosts 文件 写入: <Directory /var/www/222/>Se ...