题目链接

bzoj4709: [Jsoi2011]柠檬

题解

斜率优化

设 \(f[i]\) 表示前 \(i\)个数分成若干段的最大总价值。

对于分成的每一段,左端点的数、右端点的数、选择的数一定是相同的。如果不相同则可以从这个段里删去这个数,答案会更优。

于是就有转移:\(f_i=f_{j-1}+a·(c_i-c_j+1)^2\ ,\ j\le i\ ,\ a_j=a_i\) ,其中 \(a\) 表示原序列,\(c\) 表示这个位置时这个数第几次出现

显然这个式子可以斜率优化,整理得:$ac_i 2(c_j - 1) + f_i - a c_i^2 = f_{j-1} + a·(c_j-1)^2 $ ,那么 \(y\) 是 \(f_{j-1}+a (c_j-1)^2\) ,\(k\) 就是 \(ac_i\) ,\(x\) 是 \(2(c_j-1)\) ,\(b\) 是 \(f_i-ac_i^2\) .

这里 \(k\) 单调递增,\(x\) 递增,求\(b\)的最大值,

直接对于每个a_i维护上凸壳。在凸壳上二分。

时间复杂度 \(O(n\log n)\)

代码

#include<vector>
#include<cstdio>
#include<algorithm>
#define gc getchar()
#define pc putchar
inline int read() {
int x = 0,f = 1;
char c = gc;
while(c < '0' || c > '9') c = gc;
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc;
return x * f;
}
#define LL long long
void print(LL x) {
if(x >= 10) print(x / 10);
pc(x % 10 + '0');
}
#define y(i) (f[i - 1] + a[i] * squ(c[i] - 1))
#define x(i) 2 * (c [i] - 1)
inline LL squ(LL x) {
return x * x;
}
const int maxn = 1000007;
std::vector<int>v[maxn];
LL f[maxn],a[maxn],c[maxn],cnt[maxn] ;
int main() {
int n = read();
for(int i = 1;i <= n;++ i) {
a[i] = read();
c[i] = ++ cnt[a[i]];
int t;
while((t = v[a[i]].size() - 1) > 0 &&
(x(i) - x(v[a[i]][t])) * (y(v[a[i]][t - 1]) - y(v[a[i]][t])) - (y(i) - y(v[a[i]][t])) * (x(v[a[i]][t - 1]) - x(v[a[i]][t])) > 0) v[a[i]].pop_back();
v[a[i]].push_back(i);
int l = 1,r = v[a[i]].size() - 1,ans = 0;
while(l <= r) {
int mid = l + r >> 1;
if(f[v[a[i]][mid] - 1] + a[i] * squ(c[i] - c[v[a[i]][mid]] + 1) >
f[v[a[i]][mid - 1] - 1] + a[i] * squ(c[i] - c[v[a[i]][mid - 1]] + 1))
ans = mid,l = mid + 1;
else r = mid - 1;
}
f[i] = f[v[a[i]][ans] - 1] + a[i] * squ(c[i] - c[v[a[i]][ans]] + 1);
}
print(f[n]);
return 0;
}
/*
5
2 2 5 2 3
*/

bzoj4709: [Jsoi2011]柠檬 斜率优化的更多相关文章

  1. [BZOJ4709][JSOI2011]柠檬(斜率优化DP)

    显然选出的每一段首尾都是相同的,于是直接斜率优化,给每个颜色的数开一个单调栈即可. #include<cstdio> #include<vector> #include< ...

  2. 【BZOJ4709】[Jsoi2011]柠檬 斜率优化+单调栈

    [BZOJ4709][Jsoi2011]柠檬 Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N ≤ 100,0 ...

  3. 【bzoj4709】[Jsoi2011]柠檬 斜率优化

    题目描述 给你一个长度为 $n$ 的序列,将其分成若干段,每段选择一个数,获得 $这个数\times 它在这段出现次数的平方$ 的价值.求最大总价值. $n\le 10^5$ . 输入 第 1 行:一 ...

  4. bzoj 4709 [ Jsoi2011 ] 柠檬 —— 斜率优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709 课上讲的题,还是参考了博客...:https://www.cnblogs.com/GX ...

  5. [BZOJ4709][JSOI2011]柠檬 决策单调性优化dp

    题解: 解法1: 单调栈优化 首先发现一个性质就是 如果当前从i转移比从j转移更加优秀 那么之后就不会从j转移 所以我们考虑利用这个性质 我们要维护一个队列保证前一个超过后一个的时间单调不减 怎么来维 ...

  6. bzoj4709 [jsoi2011]柠檬

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

  7. BZOJ4709 JSOI2011柠檬(动态规划)

    首先要冷静下来发现这仅仅是在划分区间.显然若有相邻的数字相同应当划分在同一区间.还有一个显然的性质是区间的两端点应该相同且选择的就是端点的数.瞬间暴力dp就变成常数极小100002了.可以继续斜率优化 ...

  8. BZOJ4709: [Jsoi2011]柠檬(决策单调性)

    题意 题目链接 Sol 结论:每次选择的区间一定满足首位元素相同.. 仔细想想其实挺显然的,如果不相同可以删掉多着的元素,对答案的贡献是相同的 那么设\(f[i]\)表示到第\(i\)个位置的最大价值 ...

  9. 【BZOJ 4709】柠檬 斜率优化dp+单调栈

    题意 给$n$个贝壳,可以将贝壳分成若干段,每段选取一个贝壳$s_i$,这一段$s_i$的数目为$num$,可以得到$num^2\times s_i$个柠檬,求最多能得到几个柠檬 可以发现只有在一段中 ...

随机推荐

  1. Django开发笔记二

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.xadmin添加主题.修改标题页脚和收起左侧菜单 # ...

  2. 使用Groovy的sql模块操作mysql进行多种查询

    连接数据库,这里要创建一个sql实例来操作数据库,必须加载jdbc驱动包,使用两个注解,否则会报错: import groovy.sql.Sql url='jdbc:mysql://localhost ...

  3. ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Atomicity

    1.前言 Atomicity是内存访问的一个属性,描述为原子性访问,包括single-copy atomicity和multi-copy atomicity 2.基本概念 observer 可以发起对 ...

  4. Python3学习笔记25-logging模块

    logging模块,Python自带用来记录日志的模块. 因为工作需要用到关于日志的,最近一直都在看关于日志模块的东西,百度了很多文章,可惜都是看的让人一头雾水,最后运气不错,找到一篇很详细的文章.传 ...

  5. Android 自定义View二(深入了解自定义属性attrs.xml)

    1.为什么要自定义属性 要使用属性,首先这个属性应该存在,所以如果我们要使用自己的属性,必须要先把他定义出来才能使用.但我们平时在写布局文件的时候好像没有自己定义属性,但我们照样可以用很多属性,这是为 ...

  6. 测试开发之Django——No7.Django模板中的过滤器

    1.add 将参数添加到值. 例如: {{ value|add:"2" }} 如果value是4,那么输出将是6. 此过滤器将首先尝试将两个值强制转换为整数.如果失败,它将尝试将值 ...

  7. java 类型转换前先做检查

    1.传统的类型转换由RTTI确保正确性. 2.instanceof关键字(二元操作符) ,返回一个Boolean值,告诉我们对象是不是某个类或该类派生类的实例,他判断的是类型. if (a insta ...

  8. Laravel API 限速异常 HTTPException Too Many Attemps

    最近线上 Laravel 错误日志发现了一个异常 HTTPException Too Many Attemps 而我一个同事在本地开发的过程中也频繁遇到这个异常.测试环境:Laravel 5.5. 网 ...

  9. js----DOM对象(3

    表格示例(取消,全选,反选): <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  10. poj1742 多维背包

    普通的多维背包做不了,需要优化一下 但是没有学优化..别的方法也是可以做的 省去一个 表示阶段的 i 维度,dp[j]表示面值为j的钱是否被凑出来了,used[j]表示第i种硬币在凑面值为j的时候被用 ...