行情软件免费下载做360网站优化快
行情软件免费下载,做360网站优化快,软文营销模板,html的seo搜索优化problem
luogu-P3648
你正在玩一个关于长度为 nnn 的非负整数序列的游戏。这个游戏中你需要把序列分成 k1k1k1 个非空的块。
为了得到 k1k1k1 块#xff0c;你需要重复下面的操作 kkk 次#xff1a;
选择一个有超过一个元素的块#xff08;初始时你只有一块#xff0c;…problem
luogu-P3648
你正在玩一个关于长度为 nnn 的非负整数序列的游戏。这个游戏中你需要把序列分成 k1k1k1 个非空的块。
为了得到 k1k1k1 块你需要重复下面的操作 kkk 次
选择一个有超过一个元素的块初始时你只有一块即整个序列选择两个相邻元素把这个块从中间分开得到两个非空的块。每次操作后你将获得那两个新产生的块的元素和的乘积的分数。
你想要最大化最后的总得分。
输出最后得分以及划分的任一方案。
solution
前提结论得分与切的先后顺序无关。
假设要把 abcabcabc 切成 a∣b∣ca\mid b\mid ca∣b∣c。
先切 a∣bca\mid bca∣bc再切 a∣b∣ca\mid b\mid ca∣b∣cansa∗(bc)b∗cabacbcansa*(bc)b*cabacbcansa∗(bc)b∗cabacbc。先切 ab∣cab\mid cab∣c再切 a∣b∣ca\mid b\mid ca∣b∣cans(ab)∗ca∗bacbcabans(ab)*ca*bacbcabans(ab)∗ca∗bacbcab。
这样就可以从左到右 dpdpdp 了。记 sumi∑j1iaisum_i\sum_{j1}^ia_isumi∑j1iai即元素分数前缀和。
设 f(i,j):f(i,j):f(i,j): 前 iii 个数切成 jjj 段的最大得分。
则 f(i,j)maxki{f(k,j−1)sum(k)∗(sum(i)−sum(k))}f(i,j)\max_{ki}\Big\{f(k,j-1)sum(k)*\big(sum(i)-sum(k)\big)\Big\}f(i,j)maxki{f(k,j−1)sum(k)∗(sum(i)−sum(k))}。
jjj 只跟 j−1j-1j−1 有关考虑提到最外面循环内层简写 f(i,j−1)f(i)f(i,j-1)f(i)f(i,j−1)f(i)。
假设 k1k2k_1k_2k1k2且 k1k_1k1 决策优于 k2k_2k2。
则必定满足 f(k1)sumk1∗sumi−sumk12f(k2)sumk2∗sumi−sumk22f(k_1)sum_{k_1}*sum_i-sum_{k_1}^2f(k_2)sum_{k_2}*sum_i-sum_{k_2}^2 f(k1)sumk1∗sumi−sumk12f(k2)sumk2∗sumi−sumk22
f(k1)−sumk12−f(k2)sumk22(sumk2−sumk1)sumif(k_1)-sum_{k_1}^2-f(k_2)sum_{k_2}^2(sum_{k_2}-sum_{k_1})sum_i f(k1)−sumk12−f(k2)sumk22(sumk2−sumk1)sumi
sumsumsum 是前缀和数组所以 sumk2≥sumk1sum_{k_2}\ge sum_{k_1}sumk2≥sumk1具有单调性。 (f(k1)−sumk12)−(f(k2)−sumk22)(−sumk1)−(−sumk2)sum(i)\frac{\big(f(k_1)-sum_{k_1}^2\big)-\big(f(k_2)-sum_{k_2}^2\big)}{(-sum_{k_1})-(-sum_{k_2})}sum(i) (−sumk1)−(−sumk2)(f(k1)−sumk12)−(f(k2)−sumk22)sum(i) 标准斜率优化的式子因为 O(nk)O(nk)O(nk) 无法再接受一个 log\loglog 所以我最热爱的李超树就被 pass\text{pass}pass 掉了。
斜率优化想必最头疼的就是用队列维护首尾弹出时的大小于符号的定向问题。
网上一堆凸包图形对于我这种平面几何感几乎为零的蒟蒻而言简直就是天方夜谭。
所以这里写一种判断方法吧不保证正确性 队首的弹出很简单因为上面的斜率优化式子已经化出来了直接 slope(q[head],q[head1])slope(q[head],q[head1])slope(q[head],q[head1]) 和 sum(i)sum(i)sum(i) 比较。 如果 ≤sum(i)\le sum(i)≤sum(i) 说明 k2k_2k2 即后者 q[head1]q[head1]q[head1] 更优。 就需要弹队首。 队尾的弹出较为复杂考虑的是 slope(q[tail−1],q[tail])slope(q[tail-1],q[tail])slope(q[tail−1],q[tail]) 和 slope(q[tail],i)slope(q[tail],i)slope(q[tail],i)。 准确而言是考虑 q[tail]q[tail]q[tail] 可不可能做队首。 那么当现在的队尾在后面某个枚举位置时变成了队首 就必须要满足 slope(q[tail−1],q[tail])≤sumpslope(q[tail-1],q[tail])\le sum_pslope(q[tail−1],q[tail])≤sump这样才能弹出 q[tail−1]q[tail-1]q[tail−1]。 假设弹队尾的条件是 slope(q[tail−1],q[tail])≤slope(q[tail],i)slope(q[tail-1],q[tail])\le slope(q[tail],i)slope(q[tail−1],q[tail])≤slope(q[tail],i)。 显然存在 slope(q[tail−1],q[tail])≤sumpslope(q[tail],i)slope(q[tail-1],q[tail])\le sum_pslope(q[tail],i)slope(q[tail−1],q[tail])≤sumpslope(q[tail],i) 的可能性。 所以这么弹可能把答案取值点给弹出去。 假设弹队尾的条件是 slope(q[tail−1],q[tail])≥slope(q[tail],i)slope(q[tail-1],q[tail])\ge slope(q[tail],i)slope(q[tail−1],q[tail])≥slope(q[tail],i)。 因为 slope(q[tail],i)≤slope(q[tail−1],q[tail])≤sumpslope(q[tail],i)\le slope(q[tail-1],q[tail])\le sum_pslope(q[tail],i)≤slope(q[tail−1],q[tail])≤sump 所以 q[tail−1]q[tail-1]q[tail−1] 被 q[tail]q[tail]q[tail] 弹出后马上 q[tail]q[tail]q[tail] 就会被 iii 弹出去。 那么 q[tail]q[tail]q[tail] 永远都不可能当队首。 综上我们确定了队尾判断的符号。
注意前面的表述据说明 sumisum_isumi 不是严格递增的存在平台所以遇到 sumisumjsum_isum_jsumisumj 返回斜率极小值即可。
code
#include bits/stdc.h
using namespace std;
#define int long long
#define maxn 100005
int n, k, d;
int a[maxn], sum[maxn], q[maxn];
int g[maxn][205], f[maxn][205];
double slope( int x, int y ) {if( sum[x] sum[y] ) return -1e18;return (f[x][d] - sum[x] * sum[x] - f[y][d] sum[y] * sum[y]) * 1.0 / (sum[y] - sum[x]);
}
void print( int n, int d ) {if( d 1 ) return;print( g[n][d], d - 1 );printf( %d , g[n][d] );
}
signed main() {scanf( %lld %lld, n, k );for( int i 1;i n;i ) scanf( %lld, a[i] );for( int i 1;i n;i ) sum[i] sum[i - 1] a[i];for( d 1;d k;d ) {int head 1, tail 0;for( int i 1;i n;i ) {while( head tail and slope( q[head], q[head 1] ) sum[i] ) head ;f[i][d 1] f[q[head]][d] sum[q[head]] * ( sum[i] - sum[q[head]] );g[i][d 1] q[head];while( head tail and slope( q[tail - 1], q[tail] ) slope( q[tail], i ) ) tail --;q[ tail] i;}}printf( %lld\n, f[n][d] );print( n, d );return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89073.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!