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

题目链接 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_…
显然选出的每一段首尾都是相同的,于是直接斜率优化,给每个颜色的数开一个单调栈即可. #include<cstdio> #include<vector> #include<cstring> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) typedef long long ll; using namespace std; ; ll n,ans,a[N],f[N],ls…
[BZOJ4709][Jsoi2011]柠檬 Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N ≤ 100,000) 只,按顺序串在树枝上.为了方便,我们从左到右给贝壳编号 1..N.每只贝壳的大小不一定相同,贝壳 i 的大小为 si(1 ≤ si ≤10,000).变柠檬的魔法要求,Flute 每次从树枝一端取下一小段连续的贝壳,并选择一种贝壳的大小 s0.如果 这一小段贝壳中 大小为 s0 的贝壳有 t…
题目描述 给你一个长度为 $n$ 的序列,将其分成若干段,每段选择一个数,获得 $这个数\times 它在这段出现次数的平方$ 的价值.求最大总价值. $n\le 10^5$ . 输入 第 1 行:一个整数,表示 N. 第 2 .. N + 1 行:每行一个整数,第 i + 1 行表示 si. 输出 仅一个整数,表示 Flute 最多能得到的柠檬数. 样例输入 522523 样例输出 21 题解 斜率优化 设 $f[i]$ 表示前 $i$ 个数分成若干段的最大总价值. 显然对于分成的每一段,左端…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709 课上讲的题,还是参考了博客...:https://www.cnblogs.com/GXZlegend/p/8615607.html 这道题和之前写的斜率优化不同的一点是用单调栈维护上凸壳,而且需要二分查找答案: 为什么感觉每次写出来的斜率优化DP都不一样...还是没有理解透彻... 代码如下: #include<iostream> #include<cstdio> #i…
题解: 解法1: 单调栈优化 首先发现一个性质就是 如果当前从i转移比从j转移更加优秀 那么之后就不会从j转移 所以我们考虑利用这个性质 我们要维护一个队列保证前一个超过后一个的时间单调不减 怎么来维护呢 我们计算s[t-2]超过s[t-1]的时间t1,s[t-1]超过i的时间t2,如果t1<t2就说明了s[t-1]没有用了 另外再更新的时候我们算一下相邻两个哪个比较有用,要是前面哪个就弹栈 解法2: f[i]=max(f[j−1]+a[j]×(s[i]−s[j]+1)^2) 我们先尝试一下一般…
Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N  ≤ 100,000) 只,按顺序串在树枝上.为了方便,我们从左到右给贝壳编号 1..N.每只贝壳的大小不一定相同, 贝壳 i 的大小为 si(1 ≤ si ≤10,000).变柠檬的魔法要求,Flute 每次从树枝一端取下一小段连续的贝壳,并 选择一种贝壳的大小 s0.如果 这一小段贝壳中 大小为 s0 的贝壳有 t 只,那么魔法可以把这一小段贝壳变成 s…
首先要冷静下来发现这仅仅是在划分区间.显然若有相邻的数字相同应当划分在同一区间.还有一个显然的性质是区间的两端点应该相同且选择的就是端点的数.瞬间暴力dp就变成常数极小100002了.可以继续斜率优化然而懒了. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using…
题意 题目链接 Sol 结论:每次选择的区间一定满足首位元素相同.. 仔细想想其实挺显然的,如果不相同可以删掉多着的元素,对答案的贡献是相同的 那么设\(f[i]\)表示到第\(i\)个位置的最大价值,\(s[i]\)表示到\(i\)位置,\(a[i]\)的出现次数,转移方程为 \[f[i] = max(f_{j - 1} + a[i] * (s[i] - s[j] +1)^2)\] 满足\(a[i] = a[j]\) 看起来好像是可以斜率优化的样子,不过存在另外一种解释.. 具体看这里吧 感觉…
题意 给$n$个贝壳,可以将贝壳分成若干段,每段选取一个贝壳$s_i$,这一段$s_i$的数目为$num$,可以得到$num^2\times s_i$个柠檬,求最多能得到几个柠檬 可以发现只有在一段中首尾颜色相同的情况下最优,所以每次选取一段里末位的$s_i$变成柠檬,于是有$f_i=max_{j \le i}{f_{j-1}+s_i\times(pre_i-pre_j+1)^2}$ ,$pre_i$表示前$i$个贝壳里$s_i$出现了几次 令$j<k$,假设$f_{j-1}+s_i\times…