4709: [Jsoi2011]柠檬

Time Limit: 10 Sec  Memory Limit: 128 MB

Description

Flute 很喜欢柠檬。它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬。贝壳一共有 N (1 ≤ N
 ≤ 100,000) 只,按顺序串在树枝上。为了方便,我们从左到右给贝壳编号 1..N。每只贝壳的大小不一定相同,
贝壳 i 的大小为 si(1 ≤ si ≤10,000)。变柠檬的魔法要求,Flute 每次从树枝一端取下一小段连续的贝壳,并
选择一种贝壳的大小 s0。如果 这一小段贝壳中 大小为 s0 的贝壳有 t 只,那么魔法可以把这一小段贝壳变成 s
0t^2 只柠檬。Flute 可以取任意多次贝壳,直到树枝上的贝壳被全部取完。各个小段中,Flute 选择的贝壳大小 s
0 可以不同。而最终 Flute 得到的柠檬数,就是所有小段柠檬数的总和。Flute 想知道,它最多能用这一串贝壳
变出多少柠檬。请你帮忙解决这个问题。

Input

第 1 行:一个整数,表示 N。
第 2 .. N + 1 行:每行一个整数,第 i + 1 行表示 si。

Output

仅一个整数,表示 Flute 最多能得到的柠檬数。

Sample Input

5
2
2
5
2
3

Sample Output

21
HINT:Flute 先从左端取下 4 只贝壳,它们的大小为 2, 2, 5, 2。选择 s0 = 2,那么这一段
里有 3 只大小为 s0 的贝壳,通过魔法可以得到 2×3^2 = 18 只柠檬。再从右端取下最后一
只贝壳,通过魔法可以得到 1×3^1 = 3 只柠檬。总共可以得到 18 + 3 = 21 只柠檬。没有
比这更优的方案了。
 
题解
膜一波ZYFdalao
首先我们需要分析出一个性质:同一段被取下的贝壳,其第一个和最后一个的大小一定是一样的.
证明很容易.用反证法来看,如果有一段贝壳,开头和结尾不一样,显然把这两段分开施法更优
这样,我们又可以想出一个暴力:每一个节点的最大价值f[i],肯定是由前面某一个和他权值相同的点转移而来
设出现次数为s[i],权值为a[i]
显然我们可以写出暴力式子:f[i]=max{f[j-1]+a[i]*(s[i]-s[j]+1)2,a[i]==a[j]}
但是这样肯定会T的,所以我们考虑优化
对于两个决策点j1和j2,设j1<j2
如果一开始f[j1-1]+a[i]*(s[i]-s[j1]+1)2<f[j2-1]+a[i]*(s[i]-s[j2]+1)2
随着i不断向后,由于平方的增速很快,越靠前的j位置,越有可能反超,使得f[j1-1]+a[i']*(s[i']-s[j1]+1)2>f[j2-1]+a[i']*(s[i']-s[j2]+1)2
所以我们就不能再用单调队列了,因为如果我们删去了前面的某个点,它在后面可能会变得更优
于是我们考虑用单调栈维护这个东西(单调栈的实现方法随意,我个人使用了vector)
每次决策的时候,我们就用栈顶来更新
由于一个贝壳可以自己画为一段,所以应该在插入之后再计算f值
当上述"反超"的情况出现时,肯定是最先发生在栈顶和栈顶第二个元素
假设我们已经插入因此我们就看,第二个元素有"多快"超过栈顶
这个所谓的"速度"用经过a[i]的个数来体现,也就是说,看第二个元素经过几个a[i]超过栈顶,记为cnt1,如果cnt1<=s[i],我们就可以弹栈了.
但是,可能会出现一种情况:第三个元素超过栈顶,而第二个元素还没有超过栈顶
设j2<j1<i2<i1,如果j2,j1,i2三者满足这种情况,那么j2,j1,i1肯定更加满足这种情况,所以直接删掉j1就行
所以,在我们插入之前,可以先进行一波上述弹栈:如果发现第二个元素超过栈顶比栈顶超过i快,就弹栈;
所以最后的顺序是:排查->插入->计算
代码见下:
 #include<cstdio>
#include<cstring>
#include<vector>
#include<deque>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=;
const int V=;
LL a[N],f[N];
int id[N],cnt[V],n;
vector<int>q[V];
inline int max(int a,int b){return a>b?a:b;}
inline LL calc(int x,int y){return f[x-]+a[x]*y*y;}
inline int k(int x,int y)
{
int le=,ri=n,ret=n+;
while(le<=ri)
{
int mi=(le+ri)>>;
if(calc(x,mi-id[x]+)>=calc(y,mi-id[y]+))
ret=mi,ri=mi-;
else le=mi+;
}
return ret;
}
int main()
{
scanf("%d",&n);int o;
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i]);o=a[i];
cnt[o]++,id[i]=cnt[o];
while(q[o].size()>=&&k(q[o][q[o].size()-],q[o][q[o].size()-])<=k(q[o][q[o].size()-],i))q[o].pop_back();
q[o].push_back(i);
while(q[o].size()>=&&k(q[o][q[o].size()-],q[o][q[o].size()-])<=id[i])q[o].pop_back();
f[i]=calc(q[o][q[o].size()-],id[i]-id[q[o][q[o].size()-]]+);
}
printf("%lld",f[n]);
}

BZOJ4907

[BZOJ4907]柠檬的更多相关文章

  1. 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1017  Solved: 562[Submit][Status] ...

  2. bzoj4709 [jsoi2011]柠檬

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

  3. 1502: [NOI2005]月下柠檬树 - BZOJ

    Description Input 文件的第1行包含一个整数n和一个实数alpha,表示柠檬树的层数和月亮的光线与地面夹角(单位为弧度).第2行包含n+1个实数h0,h1,h2,…,hn,表示树离地的 ...

  4. BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1070  Solved: 596[Submit][Status] ...

  5. [LeetCode] Lemonade Change 买柠檬找零

    At a lemonade stand, each lemonade costs $5.  Customers are standing in a queue to buy from you, and ...

  6. [Swift]LeetCode860. 柠檬水找零 | Lemonade Change

    At a lemonade stand, each lemonade costs $5. Customers are standing in a queue to buy from you, and ...

  7. [NOI2005]月下柠檬树(计算几何+积分)

    题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 索着人生的哲理. 李哲是一个喜爱思考的孩子,当他看 ...

  8. bzoj4709: [Jsoi2011]柠檬 斜率优化

    题目链接 bzoj4709: [Jsoi2011]柠檬 题解 斜率优化 设 \(f[i]\) 表示前 \(i\)个数分成若干段的最大总价值. 对于分成的每一段,左端点的数.右端点的数.选择的数一定是相 ...

  9. Leetcode 860. 柠檬水找零

    860. 柠檬水找零  显示英文描述 我的提交返回竞赛   用户通过次数187 用户尝试次数211 通过次数195 提交次数437 题目难度Easy 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾 ...

随机推荐

  1. 优化单页面开发环境:webpack与react的运行时打包与热更新

    前面两篇文章介绍初步搭建单页面应用的开发环境: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-router实现单页面应用路由 这 ...

  2. luogu 1521-求逆序对

    题意: 逆序对指在一个序列中ai>aj && i < j,也就是一前一后两个数,当大的在前面的时候即算一对. 题目求在一个由1-n组成的序列中逆序对为k的序列的个数. 出题 ...

  3. OC中Foundation框架

    框架的概念 框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的组合,以便使研发程序变的更容易在OS X下地Mac操作系统中大约有80个框架为所有程序开发奠定基础的框架称为Foundation框架 ...

  4. SOM网络聚类完整示例(利用python和java)

    下面是几个城市的GDP等信息,根据这些信息,写一个SOM网络,使之对下面城市进行聚类.并且,将结果画在一个二维平面上. //表1中,X.为人均GDP(元):X2为工业总产值(亿元):X.为社会消费品零 ...

  5. java内存模型二

    数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性.数据依赖分下列三种类型: 名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之 ...

  6. 学习MVC之租房网站(十)-预约和跟单

    在上一篇<学习MVC之租房网站(九)-房源显示和搜索>完成了房源的显示.检索,然后是用户的预约看房,以及后台操作员对预约看房的跟单操作. 预约看房仅有将预约信息保存到对应表的操作,预约表有 ...

  7. Natas Wargame Level 16 Writeup(Content-based Blind SQL Injection)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqwAAADhCAYAAAANm+erAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF

  8. MyBatis 3 User Guide Simplified Chinese.pdf

    MyBatis 3 用户指南 帮助我们把文档做得更好… 如果你发现了本文档的遗漏之处,或者丢失 MyBatis 特性的说明时,那么最好的方法就 是了解一下这个遗漏之处然后把它记录下来. 我们在 wik ...

  9. javaWeb学习总结(8)- JSP属性范围(5)

    所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...

  10. OpenStack云平台的网络模式及其工作机制

    网络,是OpenStack的部署中最容易出问题的,也是其结构中难以理清的部分.经常收到关于OneStack部署网络方面问题和OpenStack网络结构问题的邮件.下面根据自己的理解,谈一谈OpenSt ...