首页 > 其他分享 >斜率优化学记笔记

斜率优化学记笔记

时间:2023-08-23 11:12:11浏览次数:48  
标签:head return ll j1 j2 斜率 2g 优化 记笔记

[例题](https://www.luogu.com.cn/problem/P3195)

考虑朴素做法:

$f_i$表示把前$i$个玩具装箱所需的最小费用,$s_i$为$c_i$的前缀和,则有:

$$f_i=\min\limits_{j=1}^i(f_{j-1}+(i-j+s_i-s_{j-1}-L)^2)$$

令$g_i=i+s_i-L,x_i=j+s_{j-1}$,则有:

$$f_i=\min\limits_{j=1}^i(f_{j-1}+(g_i-x_j)^2)=\min\limits_{j-1}^i(f_{j-1}+g_i^2-2g_ix_j+x_j^2)$$

时间复杂度$O(n^2)$肯定过不了

考虑斜率优化:

令$w_{i,j}=f_{j-1}+g_i^2-2g_ix_j+x_j^2$

思考当$j2>j1$且$w_{i,j2}<w_{i,j1}$时应满足什么情况?

会有:$f_{j2-1}+g_i^2-2g_ix_{j2}+x_{j2}^2<f_{j1-1}+g_i^2-2g_ix_{j1}+x_{j1}^2$

令$y_i=f_{i-1}+x_i$

化简得:$\dfrac{y_{j2}-y_{j1}}{x_{j2}-x_{j1}}<2g_i$

使用单调队列维护:

令$T(j_1,j_2)=\dfrac{y_{j2}-y_{j1}}{x_{j2}-x_{j1}}$

因为$g_i$单调递增,所以若$T(j_1,j_2)<2g_i$则$T(j_1,j_2)<2g_{i+1}$所以$j_1$将没有任何作用,则$j_1$可以踢出队列

设剩下$k_1,k_2...k_l$满足任意$T(k_x,k_{x+1})>2g_i$

则我们可知$k_1$是最优的

因为$T(k_1,k_2)>2g_i$,所以$k_1$比$k_2$优

$T(k_2,k_3)>2g_i$,所以$k_2$比$k_3$优

$......$

所以$k_1$最优

还有一个性质,若$k_2$想在单调队列中最优,则应满足$T(k_1,k_2)<2g_i,T(k_2,k_3)>2g_i$,即$T(k_2,k_3)>T(k_1,k_2)$

总结,这个单调队列里面的数应满足:

$2g_i<T(k_1,k_2)<T(k_2,k_3)<......<t(k_{l-1},k_l)$

上代码:

```cpp
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=5e4+50;
ll n,L,head=1,tail=0;
ll c[N],s[N],f[N],q[N];
ll g(ll i){return i+s[i]-L;}
ll x(ll i){return i+s[i-1];}
ll y(ll i){return f[i-1]+x(i)*x(i);}
ll T(ll i1,ll i2){return (y(i2)-y(i1))/(x(i2)-x(i1));}
int main()
{
scanf("%lld %lld",&n,&L);
for(ll i=1;i<=n;i++)
{
scanf("%lld",&c[i]);
s[i]=s[i-1]+c[i];
}
for(ll i=1;i<=n;i++)
{
while(head<tail&&T(q[tail-1],q[tail])>T(q[tail],i)) tail--;
//不满足T(j1,j2)<T(j2,j3)的情况,则j2无用,踢出j2
q[++tail]=i;
while(head<tail&&T(q[head],q[head+1])<2*g(i)) head++;
//不满足T(j1,j2)>2g[i]的情况,则j2比j1优,踢出j1
f[i]=f[q[head]-1]+(g(i)-x(q[head]))*(g(i)-x(q[head]));
}
printf("%lld\n",f[n]);
return 0;
}
```

标签:head,return,ll,j1,j2,斜率,2g,优化,记笔记
From: https://www.cnblogs.com/pengchujie/p/17650673.html

相关文章

  • 优化后端系统的计算和存储效率 - 高效算法与数据结构
    在构建后端系统时,高效的算法与数据结构是至关重要的。它们可以显著提升计算和存储效率,从而使系统更稳定、快速且可扩展。本文将介绍一些常见的高效算法和数据结构,以及它们在优化后端系统中的应用。1.哈希表哈希表是一种常用的数据结构,它通过将键映射到一个固定大小的数组中来实......
  • 记笔记背单词网站开发记录1
    我开发了一个网站,用于背单词和记笔记,已经开发并使用几年了,不过一直都是在本地部署使用。使用中间断断续续增加了一些功能,其中笔记就是后来加上的。这两个主要功能我已经使用了几年了,觉得还是有点用处的,趁着最近买了一个服务器,将其部署了起来,供大家测试使用。我介绍下具体的功......
  • Java优化技巧
    1.尽量在合适的场合使用单例单例主要适用于以下三个方面:第一,控制资源的使用,通过线程同步来控制资源的并发访问;第二,控制实例的产生,以达到节约资源的目的;第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。2.尽量避免随意使用静态变量当某个......
  • mysql单库并发优化
    是否在使用Mysql时有以下疑问:1、限制连接数时CPU占用量不大吞吐量也不高!2、增大连接数后吞吐量提升不大却容易导致Mysql服务器卡死!3、横向增加Mysql服务器时感觉并发能力提升也有限!4、...以下仅以mysql的innodb引擎说明,独享数据库服务器为例。吞吐量瓶颈mysql的吞吐量主要受:磁盘读......
  • 浅谈谷歌优化之“智能出价模式”
      智能点击付费可以帮助您通过人工出价获得更多转化。其工作原理是,根据点击在您网站上促成销售或其他转化的可能性大小,相应地自动调整您的人工出价。“目标每次转化费用”和“目标广告支出回报率”这两项智能出价策略会分别根据您设定的每次转化费用目标值和广告支出回报率目标......
  • pyproj运行效率优化方法
    介绍pyproj是一个常用的地理坐标转换python库,它其实是对proj库的python封装,底层调用proj这个c++库。当我们对大规模地理数据执行坐标转换时,需要尽可能提高pyproj的运行效率,否则会浪费大量时间。下面介绍一些常用的方法,可有效提高pyproj运行效率。方法首先importpyprojimport......
  • 跳槽前,最后撸一遍 Webpack 核心原理、babel、性能优化!
    又到一年金三银四,面试官今年最爱问点啥?说起前端工程师进阶,Webpack是一个绕不开的话题,每年都会很多新面试题源源不断的涌来,例如:Webpack的打包原理是什么?什么是loader,什么是plugin?什么是模热更新?有什么优点?Webpack之于前端,正如同gcc/g++之于C/C++。不论你用React、Vue还是Angu......
  • 前端性能优化的技巧,都总结在这本书里了!
    今天我们给大家分享的内容,主要包括通过三大优化思维、八处优化落点、40多个典型案例,教你轻松学会“大厂”的优化套路!其中有HTML、CSS、JS的层级优化、资源加载优化、其他层级优化、前端工具与新技术对性能的提升。那么,如何进行优化呢?如何才能学习到这些内容呢?这些知识都在我们为大......
  • Postgresql涉及复杂视图查询的优化案例
    一、前言对于含有union,groupby等的视图,我们称之为复杂视图。这类的视图会影响优化器对于视图的提升,也就是视图无法与父查询进行合并,从而影响访问路径、连接方法、连接顺序等。本文通过例子,给大家展示PostgreSQL这类问题及针对该问题的优化方法。二、Union视图的优化1、......
  • select语句(优化)
    MySQL常用30种SQL查询语句优化方法原创 good7ob good7ob 2023-08-1608:00 发表于江西收录于合集#数据库4个引言 在开发和维护MySQL数据库时,优化SQL查询语句是提高数据库性能和响应速度的关键。通过合理优化SQL查询,可以减少数据库的负载,提高查询效率,为用户提供更......