李超线段树初步

应用:在若干一次函数 f i ( x ) = k i x + b i f_i(x)=k_ix+b_i fi(x)=kix+bi 中,求 max ⁡ i f i ( x ) \max_i f_i(x) maxifi(x)

应用拓展:辅助斜率优化。(不过是 O ( n l o g n ) O(n log n) O(nlogn) ,不推荐)

对于区间 $\left[ l,r \right] $ ,设 i d l , r id_{l,r} idl,r 为在区间中点 x m i d x_{mid} xmid 上的最值线段,称之为“优势线段”。为了方便理解,这里把最值设为最大值。

插入直线步骤如下:

  1. 区间的 i d id id 为空,则将 i d id id 设为当前直线。否则考虑下一步。

  2. 若当前直线在 x m i d x_{mid} xmid 上的取值大于优势直线在 x m i d x_{mid} xmid 上的取值,那么交换当前直线和优势直线。

  3. 考虑到在区间中,优势直线并不一定处处大于当前直线。那么求出两条直线的交点 x 0 x_0 x0,若其在区间中,则向它所在的左/右子区间递归,重复第一步。

实现如下:

struct Line{
	double k,b;
	double at(int x){return k*x+b;}
	double intersect(Line B){return (B.b-b)*1.0/(k-B.k);}
}ll[N];
void upd(int p,int l,int r,int i)
{
	if(!id[p])
	{
		id[p]=i;
		return;
	}
	if(l==r) return;
	if(ll[i].at(mid)>ll[id[p]].at(mid)) swap(id[p],i);
	if(ll[i].k==ll[id[p]].k) return;//细节
	if(ll[id[p]].intersect(ll[i])>mid) upd(p<<1|1,mid+1,r,i);
	else upd(p<<1,l,mid,i);
}

查询实现如下:

先上代码

int qr1(int p,int l,int r,int x)
{
	if(!id[p]) return -1e18;
	if(l==r) return ll[id[p]].at(x);
	int ret=ll[id[p]].at(x);
	if(x<=mid) ret=max(ret,qr1(p<<1,l,mid,x));
	else ret=max(ret,qr1(p<<1|1,mid+1,r,x));
	return ret;
}

意思就是对于那些包含 x x x 的区间,逐级向下求优势直线在 x x x 处的取值。感性理解,其实对于区间的一些节点,最底层的区间的优势直线是空的,只需要调用覆盖这它的直线即可,而这些直线被它的父区间记录着。

注意一些细节:

  1. 求交点时特判斜率是否相同

  2. x x x 定义域中有负数时要偏移

  3. 用两点式求 k k k b b b 时记得转精度

一些例题:

板子

配合斜率优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用和提到,Linux下安装ffmpeg是非常方便的。下面给出在Linux上安装ffmpeg的步骤: 1. 首先,需要安装Cygwin。Cygwin是一个在Windows上运行类似于Linux的环境的工具。可以从官方网站上下载并安装。 2. 安装完Cygwin后,打开终端,输入以下命令下载x264源代码并进行编译: ``` wget http://mirror.yandex.ru/mirrors/ftp.videolan.org/x264/snapshots/last_x264.tar.bz2 bunzip2 last_x264.tar.bz2 tar -vxf last_x264.tar cd last_x264 ./configure --enable-static --enable-shared --disable-asm --disable-avs make && sudo make install ``` 3. 然后,从ffmpeg官网下载ffmpeg源代码,并进行编译。编译方法可以参考官方文档或者在终端中输入以下命令: ``` wget http://ffmpeg.org/releases/ffmpeg-[版本号].tar.gz tar -xzvf ffmpeg-[版本号].tar.gz cd ffmpeg-[版本号] ./configure --enable-shared make sudo make install ``` 其中,是你想要安装的ffmpeg的版本号。 4. 编译完成后,就可以使用ffmpeg了。可以通过在终端中输入`ffmpeg`命令来验证是否安装成功。 请注意,以上步骤仅适用于在Linux系统上安装ffmpeg。如果你是在其他操作系统上进行安装,请参考相关的文档或者教程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Windows下编译安装 FFmpeg](https://blog.csdn.net/heng615975867/article/details/119821945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值