4709: [Jsoi2011]柠檬
4709: [Jsoi2011]柠檬
https://www.lydsy.com/JudgeOnline/problem.php?id=4709
分析:
决策单调性+栈+二分。
首先挖掘性质:每个段选的数必须是起点或者终点,起点和终点的数必须是一样的。否则可以去掉起点或者终点的一个数,答案不会变差。
然后又n^2dp:f[i]=f[j]+cost(j,i),cost(j,i)=a[i]*(s[i]-s[j])^2。s[i]表示到i时候,a[i]的个数。
单独对每个数字考虑,因为后面存在一个平方,那么越大,增长的越快。所有下一个位置转移的位置只能比上一个位置靠前(决策单调性!),然后维护一个队列,每次从队尾转移(实际上是一个栈)。如果队尾的元素不如队尾的下一个优,弹出队尾。
可能存在队尾的元素,小于队尾-1的,但是队尾-2却更优。就是队尾-2的元素,可以覆盖它们的区间,于是加入一个点的时候,求出转移最远转移到的位置,判断。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define fi(s) freopen(s,"r",stdin);
#define fo(s) freopen(s,"w",stdout);
#define top ((int)(sk[x].size()) - 1)
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
LL f[N];
int s[N], a[N], cnt[N];
vector<int> sk[N];
int n; LL Calc(int x,int y) {
return f[x - ] + 1ll * a[x] * y * y;
} int find(int x,int y) {
int l = , r = n, ans = n + ;
while (l <= r) {
int mid = (l + r) >> ;
if (Calc(x, mid - s[x] + ) >= Calc(y, mid - s[y] + )) ans = mid, r = mid - ;
else l = mid + ;
}
return ans;
} int main() {
n = read();
for (int i=; i<=n; ++i) {
int x = read();
a[i] = x;
s[i] = ++cnt[x];
while (top >= && find(sk[x][top - ], sk[x][top]) <= find(sk[x][top], i)) sk[x].pop_back();
sk[x].push_back(i);
while (top >= && find(sk[x][top - ], sk[x][top]) <= s[i]) sk[x].pop_back();
f[i] = Calc(sk[x][top], s[i] - s[sk[x][top]] + );
}
cout << f[n];
return ;
}
4709: [Jsoi2011]柠檬的更多相关文章
- 【BZOJ】4709: [Jsoi2011]柠檬
4709: [Jsoi2011]柠檬 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 779 Solved: 310[Submit][Status][ ...
- bzoj 4709 [Jsoi2011]柠檬——单调栈二分处理决策单调性
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709 题解:https://blog.csdn.net/neither_nor/articl ...
- bzoj 4709: [Jsoi2011]柠檬
Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N ≤ 100,000) 只,按顺序串在树枝上.为了方便,我们从 ...
- bzoj 4709 [ Jsoi2011 ] 柠檬 —— 斜率优化DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709 课上讲的题,还是参考了博客...:https://www.cnblogs.com/GX ...
- bzoj4709: [Jsoi2011]柠檬 斜率优化
题目链接 bzoj4709: [Jsoi2011]柠檬 题解 斜率优化 设 \(f[i]\) 表示前 \(i\)个数分成若干段的最大总价值. 对于分成的每一段,左端点的数.右端点的数.选择的数一定是相 ...
- 【BZOJ4709】[Jsoi2011]柠檬 斜率优化+单调栈
[BZOJ4709][Jsoi2011]柠檬 Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N ≤ 100,0 ...
- 【LG5504】[JSOI2011]柠檬
[LG5504][JSOI2011]柠檬 题面 洛谷 题解 考虑\(dp\),令\(f_i\)表示\(dp\)到第\(i\)位且在第\(i\)位分段的最大值. 我们令题面中的\(s_i\)为\(a_i ...
- 笔记-[JSOI2011]柠檬
笔记-[JSOI2011]柠檬 [JSOI2011]柠檬 \(f_i\) 表示到第 \(i\) 只贝壳最多可以换得的柠檬数. 令 \(c_i=\sum_{h=1}^i[s_h=s_i]\). \[\b ...
- bzoj4709 [jsoi2011]柠檬
Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N ≤ 100,000) 只,按顺序串在树枝上.为了方便,我们 ...
随机推荐
- lock与sychronized关键字
1. lock与sychronized关键字的区别 (1) Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,Lock是代码层面的实现.(2 ...
- js oc与线程
分属不同的线程 //定义需要暴露给js的内容,这里我们只暴露personName和queryPersonName接口 @protocol PersonProtocol <JSExport> ...
- 11GR2 中的常见 RMAN 问题
版权声明:本文为博主原创文章,欢迎转载验证并评论,谢谢! https://blog.csdn.net/li70803/article/details/34104511 本文是Oracle suppor ...
- spring整合mongo及调用
spring整合mongo(maven工程下): 1.web.xml文件中配置需要加载的配置文件: <listener> <listener-class>org.springf ...
- [整理记录备忘] Docker相关
docker安装 linux上安装Docker(非常简单的安装方法) https://blog.csdn.net/qq_36892341/article/details/73918672 修改dock ...
- 深入学习c++--重新审视auto
1. auto推断变量类型 2. auto遍历 3. 自定义类可使用auto
- CSP 试题编号201803-2 Java实现
package HB; import java.util.Scanner; public class Test_06 { public static void main(String[] args) ...
- Druid手动设置参数错误
在做Druid操作的时候,出现了小错误:但是总归是找到了,并且推一及三,以后学者高效解决问题: 严重: create connection errorjava.sql.SQLException: Ac ...
- S/4 HANA中发票输出切换回NAST
在S/4 HANA中,新的输出管理Output Management叫做SAP S/4HANA output control(输出控制),是基于BRF+的,而不是原来基于NAST的.关于S4新的输出控 ...
- Altium Designer (DXP) 复制粘贴,放器件 出错报异常的原因
安装好Altium Designer (DXP) 09板和2013后,运行后原理图复制粘贴元件或者放心的器件后出现下面异常, 原因是: 1.未启动 Print Spooler服务 2.没有安装任何打印 ...