题目: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. day 28 hasattr getattr serattr delattr 和带__内置__ 类的内置方法

    反射 后边有关字符串的# class Management:# role = '管理员'# def __init__(self,name,sex,phone,mail):# self.name = n ...

  2. Day20作业及默写

    1.请使用C3算法计算出链接图中的继承顺序-Link 一 graph BT id1[A]-->id2[B] id2[B]-->id6[F] id6[F]-->id7[G] id1[A ...

  3. Java的Annotation标签

    只需要简单的使用Java的Annotation标签即可将标准的Java方法发布成Web Service,但不是所有的Java类都可以发布成Web Service.Java类若要成为一个实现了Web S ...

  4. 2019 flag

    学习 1.学会一种新的编程语言或脚本语言,并编写不少于十个应用 2.读5-8本其他学科书籍,(经济,心里学等) 3.坚持每个月最少更新8-10篇博客(技术,学习) 4.阅读并理解和应用两个开源lib ...

  5. 顶部BANNER

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. A + B 问题

    要求: 问题:给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符. 示例: 如果 a=1 并且 b=2,返回3 代码: package main import ( "fmt&q ...

  7. hadoop day 1

    hadoop是什么? 解决的问题: 海量数据的存储(HDFS):供hbase,mapreduce进行处理 海量数据的分析(MapReduce) 资源管理调度(YARN) 搜索引擎: 爬虫系统+站内搜索 ...

  8. idea 新建一个java项目并运行

    这个只能算是个笔记,参考:参考文档 打开Idea,选择create new project,如图 或选择File ——> New——>Project... 出现以下界面,选中Java,然后 ...

  9. vsftp管理脚本(CentOS6用)

    #!/bin/bash # ### BEGIN INIT INFO # Provides: vsftpd # Required-Start: $local_fs $network $named $re ...

  10. golang channel 总结

    1.未初始化的channel读,阻塞 package main import ( "fmt" "time" ) func main() { var ch cha ...