[POJ 3709] K-Anonymous Sequence(斜率优化dp / 动态维护凸包)

K-Anonymous Sequence

看了两年前自己的博客,真的好青涩,连 markdown 都不太会用。

确实观赏感不是很好。

学习真的是慢慢积累的过程,以前感觉理解很困难的事,随着知识的增长,现在都基本悟了。

problem

POJ3709

solution

f(i):f(i):f(i): 考虑到前 iii 个数,并在 iii 个数划分的最小花费。

可以直接列出状态转移,枚举前一段的位置 jjj ,则 [j+1,i][j+1,i][j+1,i] 要求相同,且长度要够长。

f(i)=min⁡{f(j)+sum(i)−sum(j)+a[j+1]∗(i−j)}(j≤i−m)f(i)=\min\Big\{f(j)+sum(i)-sum(j)+a[j+1]*(i-j)\Big\}(j\le i-m)f(i)=min{f(j)+sum(i)sum(j)+a[j+1](ij)}(jim)

其中 sum(i):sum(i):sum(i):iii 个数的和,即前缀和。

注意到题目给的性质 a[i]a[i]a[i] 是单增的。

考虑两个合法转移点 j<kj<kj<k ,且 jjj 不优于 kkk

即满足:f(j)+sum(i)−sum(j)+a[j+1]∗(i−j)≥f(k)+sum(i)−sum(k)+a[k+1]∗(i−k)f(j)+sum(i)-sum(j)+a[j+1]*(i-j)\ge f(k)+sum(i)-sum(k)+a[k+1]*(i-k)f(j)+sum(i)sum(j)+a[j+1](ij)f(k)+sum(i)sum(k)+a[k+1](ik)

化简得:f(j)−sum(j)−a[j+1]∗j−f(k)+sum(k)+a[k+1]∗k≥i∗(a[j+1]−a[k+1])f(j)-sum(j)-a[j+1]*j-f(k)+sum(k)+a[k+1]*k\ge i*\big(a[j+1]-a[k+1]\big)f(j)sum(j)a[j+1]jf(k)+sum(k)+a[k+1]ki(a[j+1]a[k+1])

一般来说,斜率优化是把 iii 的系数简化为 111 的分式形式。但是有些题目可能存在“平台”,即系数算出来为 000

除法分母不能是 000,所以为了防止程序死掉,乘法形式才是最好选择。

但是因为不等式的存在必须要求 aaa 的单调性,否则中途的决策点选择有不等式的变号,就不是斜率优化了。

李超树才是我们的红太阳!

单调队列存储合法转移点,每次取最优的队首转移。

对于队首的维护是非常简单的。

但斜率优化难以理解的问题就在队尾的维护,即常说的凸包维护。

网上很多就直接上凸包图像,然后从直线斜率角度入手,这里不赘述。

以此题为例,用语言化的最优点选择来尝试阐释斜率问题。

一般会有,令 Y(j,k)=f(j)−sum(j)−a[j+1]∗j−f(k)+sum(k)+a[k+1]∗kX(j,k)=a[j+1]−a[k+1]Y(j,k)=f(j)-sum(j)-a[j+1]*j-f(k)+sum(k)+a[k+1]*k\quad X(j,k)=a[j+1]-a[k+1]Y(j,k)=f(j)sum(j)a[j+1]jf(k)+sum(k)+a[k+1]kX(j,k)=a[j+1]a[k+1]

如果只考虑两个选择点 (x,y)(x,y)(x,y),显然当 iii 增大后,不等式可能存在反向的问题,即 xxx 不一定就永远差于 yyy。【现在是要考虑 iii 后面点的转移,iii 点也是转移点】

所以是考虑三个点 (x,y,z),x<y<z(x,y,z),x<y<z(x,y,z),x<y<z【这对应着计算 iii 后,iii 与凸包上的最后一个点形成的直线,以及凸包最后两个点形成的直线,两个直线的维护】

因为本题是最小值,所以当 Y(x,y)X(x,y)≥Y(y,z)X(y,z)⇒Y(x,y)⋅X(y,z)≥Y(y,z)⋅X(x,y)\frac{Y(x,y)}{X(x,y)}\ge \frac{Y(y,z)}{X(y,z)}\Rightarrow Y(x,y)·X(y,z)\ge Y(y,z)·X(x,y)X(x,y)Y(x,y)X(y,z)Y(y,z)Y(x,y)X(y,z)Y(y,z)X(x,y) 时,去掉 yyy。【维护凸包】

接下来解释为什么??

回到上面式子去,因为 aaa 是单增,所以 j<k⇒X(j,k)<0j<k\Rightarrow X(j,k)<0j<kX(j,k)<0 。即 Y(j,k)X(j,k)≤i\frac{Y(j,k)}{X(j,k)}\le iX(j,k)Y(j,k)i,证明 jjj 不优于 kkk,且注意到 Y(j,k)X(j,k)\frac{Y(j,k)}{X(j,k)}X(j,k)Y(j,k) 是一个常数,与枚举点 iii 无关。

现在回到这里,对于某个 iii,如果 Y(y,z)X(y,z)≥i\frac{Y(y,z)}{X(y,z)}\ge iX(y,z)Y(y,z)i 那么一定有 Y(x,y)X(x,y)≥i\frac{Y(x,y)}{X(x,y)}\ge iX(x,y)Y(x,y)i

即,如果 yyy 优于 zzz,那么 xxx 一定也优于 yyy,那就没有 yyy 什么事了。【对应的上凸包维护,即斜率逐渐递减】

code

#include <cstdio>
using namespace std;
#define int long long
#define maxn 500005
int T, n, m;
int a[maxn], q[maxn], f[maxn], sum[maxn];int Y( int j, int k ) {return f[j] - sum[j] + j * a[j + 1] - f[k] + sum[k] - k * a[k + 1];
}int X( int j, int k ) {return a[j + 1] - a[k + 1];
}signed main() {scanf( "%lld", &T );while( T -- ) {scanf( "%lld %lld", &n, &m );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &a[i] ), sum[i] = sum[i - 1] + a[i];int head = 1, tail = 0; q[++ tail] = 0;for( int i = 1;i <= n;i ++ ) {while( head < tail and Y( q[head], q[head + 1] ) >= i * X( q[head], q[head + 1] ) ) head ++;int j = q[head];f[i] = f[j] + sum[i] - sum[j] - a[j + 1] * ( i - j );int k = i - m + 1;if( k >= m ) {while( head < tail and Y( q[tail - 1], q[tail] ) * X( q[tail], k ) >= Y( q[tail], k ) * X( q[tail - 1], q[tail] ) )tail --;q[++ tail] = k;}}printf( "%lld\n", f[n] );}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Keiichi Tsuchiya the Drift King

Keiichi Tsuchiya the Drift King 题意&#xff1a; 给定一辆小车长宽分别为 b&#xff0c;a&#xff0c;轨道的圆弧部分半径为 r&#xff0c;圆弧对应的角度为 d&#xff0c;求出小车能通过轨道的最小轨道宽度 w。 题解&#xff1a; 我们考虑小车处于什么状态会使弯道最宽…

AspNet Core 下利用普罗米修斯+Grafana构建Metrics和服务器性能的监控

概述Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。该项目有非常活跃的社区和开发人员&#xff0c;目前是独立的开源项目&#xff0c;现在最常见的Kubernetes容器管理系统中&#xff0c;通常也会搭配Prometheus进行监控。prome…

模板:pb_ds指南

科技改变生活 前言 本来一直被畏于巨长的声明&#xff0c;没有学这个东西… 直到 棘手的操作 这道题&#xff0c;pb_ds模拟实现的两个log的做法不仅好写的一批&#xff0c;连时间竟然也把我单log的左偏树爆踩了&#xff1f;&#xff1f;&#xff1f; … 我选择打不过就加入… …

【学习笔记】多重背包相关优化——二进制优化/单调队列优化

多重背包——二进制优化/单调队列优化二进制优化单调队列优化代码都是 POJ1742 的&#xff0c;注意&#xff0c;那道题二进制优化会超时。 普通的多重背包式子&#xff0c;物品个数限制&#xff1a;c[i]c[i]c[i]&#xff0c;单个物品价值 w[i]w[i]w[i]&#xff0c;每个物品的体…

Game of Swapping Numbers

Game of Swapping Numbers 题意&#xff1a; A&#xff0c;B两个数组&#xff0c;让你对A进行k次操作&#xff0c;每次操作为选两个位置的数&#xff0c;进行交换&#xff0c;求最大化的Σ|Ai-Bi| 题解&#xff1a; 以前有做过最小化的情况&#xff0c;就是把每次交换作定量…

软件工程真的是一门什么用都没有的学科么?

软件工程真的是一门什么用都没有的学科么&#xff1f;-----读《构建之法》有感楔子我很惭愧&#xff0c;构建之法这本书已经出版四五年了&#xff0c;我之前却未曾涉猎&#xff0c;还是在通过组织长沙.net技术社区之后&#xff0c;才因为因缘际遇有幸认识邹欣邹老师之后&#x…

Ball Dropping

Ball Dropping 题意&#xff1a; 求&#xff1f;的具体长度 题解&#xff1a; 算一算就出来了 代码&#xff1a; #include<bits/stdc.h> using namespace std; int main(){double r,a,b,h;cin>>r>>a>>b>>h;if(2*r<b&&2*r<…

[WF2011] MachineWorks(李超树优化dp)

[WF2011]MachineWorksproblem BZOJ3963 solution 来得比较快的是&#xff0c;直接设 dpi,j:dp_{i,j}:dpi,j​: 考虑第 jjj 天换购 iii 机器。 但是马上注意到天数是 1e91e91e9 级别的&#xff0c;而机器是 1e51e51e5 级别。 稍微想想&#xff0c;就能知道&#xff0c;因为…

P3644 [APIO2015]八邻旁之桥(中位数、堆)

前言 卡了很长时间的一个题。 一开始 k1 的关键性质把握就跑偏了&#xff0c;后面基本在硬做… 关键就是一直把每个人当成一条线段作为整体在看&#xff0c;使问题很复杂… 最后用 three-pointers 磕磕绊绊搞出来了。 但是根本不用&#xff01; 解析 这题关键就在于&#xf…

尝试:Script Lab,开发模式之知识储备//SL02

前期00&#xff1a;深度&#xff1a;从 Office 365 新图标来看微软背后的设计新理念前期01&#xff1a;尝试&#xff1a;Script Lab&#xff0c;快速 Office 365 开发工具 //SL01本期02&#xff1a;尝试&#xff1a;Script Lab&#xff0c;开发模式之知识储备 //SL02项目特点适…

【学习笔记】Miller-Rabin(米勒-拉宾)素性测试,附常用表

TOC 素性测试是检验一个给定的整数是否为素数的测试。 最简单的就是用 n\sqrt{n}n​ 以内的数去试除。这是确定性的算法&#xff0c;即能准确知道 nnn 是否为质数。 但今天学习的是一种随机算法。 Fermat 小定理 如果 ppp 是一个质数&#xff0c;且 a%p≠0a\%p≠0a%p​0…

Hash Function

Hash Function 文章目录题意&#xff1a;题解&#xff1a;代码NTT代码FFT代码题意&#xff1a; 给定n个互不相同的数&#xff0c;找一个最小的模域&#xff0c;使得它们在这个模域下互不相同。n<5e5 题解&#xff1a; 考虑两个数a和b&#xff0c;a与b模m余数相同&#xf…

P5321 [BJOI2019]送别(LCT)

Foreword\text{Foreword}Foreword 肝了一下午一晚上的码农题… &#xff08;主要就是在 debug&#xff0c;LCT 太难 de 了…&#xff09; 感谢 M_sea&#xff0c;在调无可调认为LCT会不会不可做时&#xff0c;我看到了他的题解&#xff0c;几乎一样的思路&#xff0c;给了我继…

WebApi网关之Bumblebee和Ocelot性能对比

Bumblebee是基于.net core 2.1开发的WebApi网关组件&#xff0c;由于Bumblebee所追求的轻量化和性能&#xff0c;所以它并没有像Ocelot那样从asp.net core上进行扩展&#xff1b;而是构建在BeetleX.FastHttpApi之上&#xff0c;主要原因BeetleX.FastHttpApi有着更轻量化和高性能…

【无码专区11】异或2(结论 / 推式子 + 哈希hash + 大整数高精度 加减乘除重载考察)

本题已自我实现。但仍归于无码专区 problem 求 ∑i1n−1i⨁(n−i)\sum_{i1}^{n-1}i\bigoplus (n-i)∑i1n−1​i⨁(n−i)。 20%,n≤1e6;;50%,n≤1e9;;70%,n≤1e18;;100%,n≤1050020\%,n\le 1e6;;50\%,n\le 1e9;;70\%,n\le 1e18;;100\%,n\le 10^{500}20%,n≤1e6;;50%,n≤1e9;;7…

模板:常系数齐次线性递推(线性代数、多项式)

所谓常系数齐次线性递推&#xff0c;就是系数为常数的齐次线性递推。 &#xff08;逃&#xff09; 前言 sto Asta orz&#xff01; 又是一个名字高大上&#xff0c;实则小清新的算法&#xff01; 解析 考虑一个 k 次的线性递推&#xff1a; an∑i1kfian−ia_n\sum_{i1}^kf_…

2021牛客暑期多校训练营1

2021牛客暑期多校训练营1 题号题目知识点难度AAlice and Bob博弈论BBall Dropping计算几何签到CCut the TreeDDetermine the Photo Position签到EEscape along Water PipeFFind 3-friendly Integers真签到GGame of Swapping Numbers思维题&#xff0c;推导HHash FunctionFFT&a…

【无码专区12】子集和(背包dp)

此题已自我实现&#xff0c;但仍归于无码专区 本题在考场上就过了&#xff0c;所以难度并不高&#xff0c;发现性质即可。 problem 有 nnn 个正整数 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​&#xff0c;他们的和为 mmm。你想对于其每一个子集 SSS&#xff0c;求出他…

Penguins

Penguins 题意&#xff1a; 有两个20*20的地图&#xff0c;有障碍物&#xff0c;两个地图各有一个小人&#xff0c;左侧地图的小人要从右下角走到右上角&#xff0c;右侧地图的小人要从左下角走到左上角&#xff0c;这两个小人是镜像移动的&#xff0c; 左侧小人右侧小人左移…

盲盒(随机概率 + 最大公约数)

盲盒problemsolutioncodeproblem 有 2n2n2n 个盲盒&#xff0c;每个盲盒有一个惊喜值 aia_iai​。 打开恰好 nnn 个盲盒&#xff0c;获得的惊喜值为这些盲盒惊喜值的最大公约数。 求能获得的最大惊喜值。 n≤1e5,ai≤1e12n\le 1e5,a_i\le 1e12n≤1e5,ai​≤1e12。 solution…