首页 > 其他分享 >四边形不等式学习笔记

四边形不等式学习笔记

时间:2024-08-28 17:50:21浏览次数:9  
标签:le 不等式 int mid 笔记 四边形 include

1.定义

1.1 四边形不等式

四边形不等式指的是二元函数 \(w(l,r)\) 对于 \(l_1 \le l_2 \le r_1 \le r_2\) 满足:

\[w(l_1, r_1) + w(l_2, r_2) \le w(l_2, r_1) + w(l_1, r_1) \]

也就是交叉优于包含。

四边形不等式的等价形式是:

\[w(l, r - 1) + w(l + 1, r) \le w(l, r) + w(l + 1, r - 1) \]

常见的满足四边形不等式的函数包括几类:

  1. \(w(l,r) = f(l) - g(r)\),显然不等号会去等。常见的有前缀和。

  2. \(w(l,r) = f(a_r - a_l)\),其中 \(a_1 < a_2 < \dots < a_n\) 且 \(f\) 是凸函数(也就是二阶差分非负)。比如 \(f(x) = x^p(p > 1)\) 和 \(f(x) = -x^p(0 < p < 1)\)。

  3. 两个函数分别满足四边形不等式,则它们的和也满足。

1.2 单调性

如果函数 \(w(l,r)\) 满足:

\[\forall l' \le l \le r \le r', w(l,r) \le w(l', r') \]

则其满足区间包含单调性。

对于一个动态规划来说,我们记录其最优决策点集合中最小的元素为 \(opt\),下面记为最优决策点(注意一定要取最小的或者最大的)。

我们假设下面的函数计算都是 \(O(1)\) 的,且都满足四边形不等式。

2. 离线版本

考虑转移方程:

\[f(i) = \min_{1 \le j < i}\{w(j,i)\} \]

直接暴力是 \(O(n^2)\),我们考虑如何在 \(O(n \log n)\) 内计算。

我们定义 \(opt(i)\) 是 \(f_i\) 的最优决策点。我们可以证明若 \(i \le i'\),则 \(opt(i) \le opt(i')\),也就是其具有决策单调性。

证明不难,oi-wiki 上有。

所以我们现在考虑分治计算:取中点 \(m\),我们先算出 \(f(m),opt(m)\),然后递归计算两边的值。考虑到两边的 \(opt\) 集合被一分为二,所以每一层的总计算量都是 \(O(n)\) 的,总共 \(\log n\) 层,时间复杂度 \(O(n \log n)\)。

模板题 P3515 [POI2011] Lightning Conductor

这道题转化一下就是 \(w(l,r) = a_r- a_l - \sqrt{|r - l|}\)。

这个函数的前半部分属于四边形不等式的函数类的第一种,后半部分属于第二种,所以这个函数满足四边形不等式。

然后我们就可以用分治求解了:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5e5 + 5;

int n, h[N] = {0};

double w(int j, int i) {
	return h[j] - h[i] + sqrt(i - j);
}

void slv(int *f, int l, int r, int pl, int pr) {
	if (l > r)
		return;
	int mid = (l + r) / 2, p = pl;
	for (int i = pl + 1; i <= min(mid - 1, pr); i++)
		if (w(i, mid) > w(p, mid))
			p = i;
	f[mid] = max(f[mid], (int)ceil(w(p, mid)));
	slv(f, l, mid - 1, pl, p);
	slv(f, mid + 1, r, p, pr);
}
int f[N] = {0};
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		scanf("%d", &h[i]);
	slv(f, 1, n, 1, n);
	reverse(h + 1, h + n + 1);
	reverse(f + 1, f + n + 1);
	slv(f, 1, n, 1, n);
	for (int i = 1; i <= n; i++) 
		printf("%d\n", f[n - i + 1]);
	return 0;
}

3. 1D-1D 在线版本

求:

\[f(i) = \min_{1 \le j < i}\{f(j) + w(j,i)\} \]

考虑到 \(f(j) + w(j,i)\) 显然也是满足四边形不等式的,所以决策单调性依然存在,但是由于我们依赖前面的结果,所以我们不能用分治来求解了。

这里我们用的方法是二分队列。

我们考虑决策点的值。

刚开始所有都是 0,然后我们加入 1 后一段后缀会变成 1,加入 2 后一段比之前后缀会变成 2,以此类推。

我们用队列存储 \((l,r,p)\) 表示当前 \([l,r]\) 的最优决策点都是 \(p\),一开始只有 \((1,n,0)\),我们假设现在计算 \(i\)。

首先,我们计算 \(f(i)\),显然其最优决策点就是现在的队首。

计算完之后,我们先判断队首是否为空,如果为空就弹出。

然后我们开始和队尾比较,每次看

标签:le,不等式,int,mid,笔记,四边形,include
From: https://www.cnblogs.com/rlc202204/p/18385231

相关文章

  • Netty 学习笔记
    Java网络编程早期的JavaAPI只支持由本地系统套接字库提供的所谓的阻塞函数,下面的代码展示了一个使用传统JavaAPI的服务器代码的普通示例//创建一个ServerSocket用以监听指定端口上的连接请求ServerSocketserverSocket=newServerSocket(5000);//对accept方法......
  • Java基础-学习笔记15
    15泛型1.泛型泛型的好处编译时,检查添加元素的类型,提高了安全性减少了类型转换的次数,提高效率比如:ArrayListarr=newArrayList();在放入时,如果添加Dog类到arr里,编译器发现添加的类型不满足要求,就会报错;在取出时,直接取出Person类,就不用再转型使用。泛型的......
  • MybatisPlus学习笔记
    MyBatisPlus从入门到精通1.概述MybatisPlus是一款Mybatis增强工具,用于简化开发,提高效率。它在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。官网:https://baomidou.com/2.快速入门2.0准备工作①准备数据CREATETABLE`user`(`id`bigint(20)NOTNULL......
  • 系统架构师考试学习笔记第二篇——架构设计专业知识(6)系统工程基础知识
    本章节考点分析:        第6课时主要学习系统工程和系统性能等内容。根据考试大纲,本课时知识点会涉及单项选择题,约占2~5分。本课时内容侧重于概念知识也会有计算题。根据以往全国计算机技术与软件专业技术资格(水平)考试的出题规律,考查的知识点多来源于教材,扩展内容较......
  • Spring超硬核笔记———全是干货
    为什么用spring?Spring的核心功能IOC(控制反转,依赖注入),AOP(面向切面的编程)IOC:我们在使用过程中不用关注于对象是怎么创建的,只用应用过去,sping自动帮我们完成注入,对象的创建,spring默认创建对象是单例,这样减少了频繁创建对象,让对象重复利用,所有的对象都是放在BeanFactory工厂......
  • Effective Java理解笔记系列-第1条-何时考虑用静态工厂方法替代构造器?
    为什么写这系列博客?在阅读《EffectiveJava》这本书时,我发现有许多地方需要仔细认真地慢慢阅读并且在必要时查阅相关资料才能彻底搞懂,相信有些读者在阅读此书时也有类似感受;同时,在解决疑惑的过程中,还存在着有些内容不容易查找、查找到的解答质量不高等问题,于是我决定把我阅读此书......
  • 【学习笔记】SSL证书之文件格式
    SSL证书及密钥以文件的形式存在于我们的电脑上,这些文件一般为以下4种格式:DERPEMPFX/PKCS#12PKCS#71、DERDistinguishedEncodingRules(可辨别编码规则)是在线证书的格式二进制编码,如果用TXT进行查看会呈现出乱码。在SSL证书领域,我们一般不用DER格式的文件来交换证书(因为DER......
  • 给自己复盘的随想录笔记-链表练习题(在整理ing)
    删除链表的倒数第N个节点双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。思路是这样的,但要注意一些细节。分为如下几步:推荐大家使用虚拟头结点,这样方便处理删除实际头结点的逻辑,定......
  • 给自己复盘的tjxt笔记day9
    优惠券管理开发流程需求分析,接口统计,数据库设计,创建分支,创建新模块(依赖,配置,启动类),生成代码,引入枚举状态优惠券管理增删改查的业务代码,没有新的知识点新增优惠券@Override@TransactionalpublicvoidsaveCoupon(CouponFormDTOdto){//1.保存优惠券......
  • LightGODE论文阅读笔记
    DoWeReallyNeedGraphConvolutionDuringTraining?LightPost-TrainingGraph-ODEforEfficientRecommendation论文阅读笔记Abstract现存的问题:​ 图卷积网络(GCN)在训练推荐系统(RecSys)中的效率和可扩展性一直是令人担忧的问题,阻碍了它们在现实世界中的应用。提出方法:......