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) 只,按顺序串在树枝上.为了方便,我们 ...
随机推荐
- python中的装饰
在面向对象(OOP)的设计模式中,decorator被称为装饰模式.OOP的装饰模式需要通过继承和组合来实现,而Python除了能支持OOP的decorator外,直接从语法层次支持decorator ...
- C/C++——new/delete和malloc/free的区别
new/delete和malloc/free的区别 扩容操作: 对于malloc是有一个realloc函数对应用于扩容的: 对于new,只能再new一个,for循环赋值过去,把原来的delete掉: ...
- 关于numpy mean函数的axis参数
import numpy as np X = np.array([[1, 2], [4, 5], [7, 8]]) print np.mean(X, axis=0, keepdims=True) pr ...
- HDU 1599 find the mincost route(floyd求最小环 无向图)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1599 find the mincost route Time Limit: 1000/2000 MS ...
- MAPREDUCE框架结构及核心运行机制
1.2.1 结构 一个完整的mapreduce程序在分布式运行时有三类实例进程: 1.MRAppMaster:负责整个程序的过程调度及状态协调 2.mapTask:负责map阶段的整个数据处理流程 3 ...
- 32位 的变量 用于表示 ms ,可以表示多少天那?
1.在 TI 的 BLE 协议栈 中,即 OSAL 中 获取当前 系统 tick 的方法如下 /* * Read the system clock - returns milliseconds * ...
- Java Activiti 流程审批 后台框架源码 springmvc SSM 工作流引擎
即时通讯:支持好友,群组,发图片.文件,消息声音提醒,离线消息,保留聊天记录 工作流模块-------------------------------------------------------- ...
- C++笔记013:C++对C的扩展——C++中所有变量和函数都必须有类型
原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ C++中所有的变量和函数都必须有类型: C语言中的默认类型在C++中是不合法的! 在C语言里面可以写一些很奇怪的函数!并且可以运行成功! ...
- 同步工具类-----循环栅栏:CyclicBarrier
import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; impor ...
- Kali之——解决物理机U盘安装Kali Linux2018.1,光驱无法加载问题
Kali系统和烧录软件 链接:https://pan.baidu.com/s/1v78d62hdF95NM2minct9sw 提取码:b08k 1.无效的方法: (1)执行 df -m,然后查看U盘设 ...