【高阶数据结构】线段树加乘(维护序列)详细解释乘与加懒标记
文章目录
- 1.题目
- [AHOI2009] 维护序列
- 2.懒标记处理
- 先加后乘的形式
- 1. 先加后乘的操作
- 先乘后加的形式
- 2. 先乘后加的操作
- **乘法操作**
- **加法操作**
- 懒标记的下传
- 3.代码
1.题目
题目来源:https://www.luogu.com.cn/problem/P2023
[AHOI2009] 维护序列
题目背景
老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。
题目描述
有一个长为 n n n 的数列 { a n } \{a_n\} {an},有如下三种操作形式:
- 格式
1 t g c
,表示把所有满足 t ≤ i ≤ g t\le i\le g t≤i≤g 的 a i a_i ai 改为 a i × c a_i\times c ai×c ; - 格式
2 t g c
表示把所有满足 t ≤ i ≤ g t\le i\le g t≤i≤g 的 a i a_i ai 改为 a i + c a_i+c ai+c ; - 格式
3 t g
询问所有满足 t ≤ i ≤ g t\le i\le g t≤i≤g 的 a i a_i ai 的和,由于答案可能很大,你只需输出这个数模 p p p 的值。
输入格式
第一行两个整数 n n n 和 p p p。
第二行含有 n n n 个非负整数,表示数列 { a i } \{a_i\} {ai} 。
第三行有一个整数 m m m,表示操作总数。
从第四行开始每行描述一个操作,同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。
输出格式
对每个操作 3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。
2.懒标记处理
先加后乘的形式
假设我们要在一个区间上做更新操作,区间内的某个数的值用 x x x 表示,add 和 mul 分别代表加法因子和乘法因子。
1. 先加后乘的操作
先加后乘的更新过程是:
我们想在区间上的每个元素先加一个数 a a a,再乘以一个数 m m m,这个操作可以表示为:
( x + add ) ∗ mul (x + \text{add}) * \text{mul} (x+add)∗mul
-
乘法更新
假设当前要在区间上乘以 a a a,则操作变成:
( x + add ) ∗ mul ∗ a (x + \text{add}) * \text{mul} * a (x+add)∗mul∗a
新的乘法标记将变为 mul ∗ a \text{mul} * a mul∗a,这是可以接受的。 -
加法更新
假设现在要在区间上加上 a a a,则变成:
( x + add ) ∗ mul + a (x + \text{add}) * \text{mul} + a (x+add)∗mul+a
这个表达式不容易简化成一种标准形式。我们可以尝试将其转换为:
( x + add + a mul ) ∗ mul (x + \text{add} + \frac{a}{\text{mul}}) * \text{mul} (x+add+mula)∗mul然而,这样得到的 add 标记变成了 add + a mul \text{add} + \frac{a}{\text{mul}} add+mula,这个值可能是一个小数,很难表示或处理。因此,先加后乘的形式并不理想。
先乘后加的形式
2. 先乘后加的操作
另一种常见的更新方式是先乘后加,即首先进行乘法操作,然后再进行加法操作。我们可以表示为:
x ∗ mul + add x * \text{mul} + \text{add} x∗mul+add
乘法操作
如果我们在这个数上乘以 m m m,则更新如下:
( x ∗ mul + add ) ∗ m = x ∗ mul ∗ m + add ∗ m (x * \text{mul} + \text{add}) * m = x * \text{mul} * m + \text{add} * m (x∗mul+add)∗m=x∗mul∗m+add∗m
因此:
- 新的乘法标记变成了 mul ∗ m \text{mul} * m mul∗m。
- 新的加法标记变成了 add ∗ m \text{add} * m add∗m。
加法操作
如果我们在这个数上加上 a a a,则更新如下:
x ∗ mul + add + a x * \text{mul} + \text{add} + a x∗mul+add+a
这里:
- 新的加法标记变为 add + a \text{add} + a add+a。
- 乘法标记保持不变。
懒标记的下传
考虑区间树的情况,假设父节点有乘法标记 m m m 和加法标记 a a a,其更新表达式为:
( x ∗ mul + add ) ∗ m + a = x ∗ mul ∗ m + add ∗ m + a (x * \text{mul} + \text{add}) * m + a = x * \text{mul} * m + \text{add} * m + a (x∗mul+add)∗m+a=x∗mul∗m+add∗m+a
-
左右孩子节点的
sum
更新为:
root.sum ∗ m + ( root.r − root.l + 1 ) ∗ a \text{root.sum} * m + (\text{root.r} - \text{root.l} + 1) * a root.sum∗m+(root.r−root.l+1)∗a
这是一个标准的加法和乘法更新,可以继续进行懒标记下传。 -
乘法标记(mul)下传时,更新为:
mul ∗ m \text{mul} * m mul∗m -
加法标记(add)下传时,更新为:
add ∗ m + a \text{add} * m + a add∗m+a
3.代码
//为什么先加后乘的形式不可以
//我们要变成(x+add)*mul的形式
//假设现在要在这个区间上乘 a
//那么这个数就变成了 (x+add)*mul*a
//新的mul标记就变成了 mul*a 这个是可以的
//假设现在要在这个区间上加 a
//那么这个数就变成了 (x+add)*mul + a
//化成上面的形式 (x+add + a/mul)*mul
//显然新的add标记(add+ a/mul)可能是个小数,不好表示,故而这种方式不合适//先乘后加形式
// x*mul +add的形式
// 在这个数上乘m
// (x*mul+add)*m
// x*mul*m + add*m
// 新的mul标记就变成了 mul*m
// 新的add标记就变成了 add*m
// 在这个数上加a
// x*mul + add + a
// mul标记不变
// 新的add标记就变成了 add + a
// pushdown的时候为什么l和r的懒标记怎么改
// 显然父亲结点的mul和add就是以先乘后加的形式下传
// 假设父亲结点为m和a
// (x*mul+add)*m+ a
// x*mul*m +add*m+a
// 左右孩子的 sum = (root.sum*m+(root.r-root.l+1)*add)
// mul : mul*m
// add : add*m+a#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
typedef long long ll;
using LL =long long;
const int N = 1e5 + 10;
int n, p, m;
int w[N];
struct Node{int l, r, sum, add, mul;
} tr[4 * N];void pushup(int u)
{tr[u].sum = (tr[u<<1].sum+tr[u<<1|1].sum)%p;
}void cale(Node &root, int a, int m)
{root.sum = (ll)((ll)(root.sum)*m +(ll)(root.r-root.l + 1)*a)%p;root.add = (ll)(root.add*m+a)%p;root.mul = (ll)root.mul*m%p;
}void pushdown(int u)
{Node & root = tr[u],& left =tr[u<<1], &right =tr[u<<1|1];cale(left,root.add,root.mul);cale(right,root.add,root.mul);tr[u].add=0;tr[u].mul=1;
}void build(int u, int l, int r)
{if(l==r){tr[u]={l,r,w[l],0,1};}else{tr[u]={l,r,0,0,1};int mid = l+r>>1;build(u<<1,l,mid);build(u<<1|1,mid+1,r);pushup(u);}
}void modify(int u, int l, int r, int add, int mul)
{if(tr[u].l>=l&&tr[u].r<=r){cale(tr[u],add,mul);}else{pushdown(u);int mid =tr[u].l+tr[u].r>>1;if(l<=mid)modify(u<<1,l,r,add,mul);if(r >mid)modify(u<<1|1,l,r,add,mul);pushup(u);}
}int query(int u, int l, int r)
{if(tr[u].l>=l &&tr[u].r<=r)return tr[u].sum;else{pushdown(u);int mid =tr[u].l+tr[u].r>>1;ll res =0;if(l<=mid)res += query(u<<1,l,r)%p;if(r >mid)res = (res+query(u<<1|1,l,r))%p;return res;}
}signed main()
{cin>>n>>p;for(int i=1;i<=n;i++)cin>>w[i];build(1,1,n);cin>>m;while ( m -- ){int t, l, r, d;cin>>t>>l>>r;if ( t == 1 ) {cin>>d;modify(1, l, r, 0, d);}else if ( t == 2 ){cin>>d;modify(1, l, r, d, 1);}else cout<<query(1, l, r)<<'\n';}return 0;
}
相关文章:
【高阶数据结构】线段树加乘(维护序列)详细解释乘与加懒标记
文章目录 1.题目[AHOI2009] 维护序列 2.懒标记处理先加后乘的形式1. 先加后乘的操作 先乘后加的形式2. 先乘后加的操作**乘法操作****加法操作** 懒标记的下传 3.代码 1.题目 题目来源:https://www.luogu.com.cn/problem/P2023 [AHOI2009] 维护序列 题目背景 老师交给小可可…...
ElasticSearch常见知识点
1、什么是ElasticSearch? Elasticsearch 是基于 Lucene 的 Restful 的分布式实时全文搜索引擎,每个字段都被索引并可被搜索,可以快速存储、搜索、分析海量的数据。 2、什么是倒排索引? 正常的索引是比如二叉树。倒排索引是用内容…...
ARM与x86:架构对比及其应用
典型的服务器架构的x86采用模块化方法,基于带有可更换组件的主板。CPU和其他组件(如显卡和GPU、内存控制器、存储或处理核心)针对特定功能进行了优化,可以轻松更换或扩展。然而,这种便利是有代价的;这些硬件…...
macos 搭建 ragflow 开发环境
ragflow 是一个很方便的本地 RAG 库。本文主要记录一下在本机的部署过程 1、总体架构说明 开发环境:macbook pro(m1),16G内存 512G固态 因本机的内存和硬盘比较可怜,所以在服务器上部署基础 docker 包,…...
CVPR 2024 人体姿态估计总汇(3D人体、手语翻译和人体网格恢复/重建等)
1、Human Pose Estimation(人体姿态估计) CLOAF: CoLlisiOn-Aware Human FlowMeta-Point Learning and Refining for Category-Agnostic Pose EstimationSurMo: Surface-based 4D Motion Modeling for Dynamic Human Rendering ⭐codeGALA: Generating Animatable Layered Ass…...
docker 安装mongodb
1、先获取mongodb镜像 docker pull mongo:4.2 2、镜像拉取完成后,运行mongodb容器 docker run \ -d \ --name mongo \ --restartalways \ --privilegedtrue \ -p 27017:27017 \ -v /home//mongodb/data:/data/db \ mongo:4.2 --auth 3、mongodb服务配置 如上图&…...
82_Redis缓存雪崩击穿穿透问题
在实际业务应用中,Redis常常与诸如MySQL这类关系型数据库协同工作,旨在缓解后端数据库的负担。它扮演了一个高效缓存的角色,特别是针对那些频繁被访问的热点数据。当用户发起查询时,系统首先尝试从Redis中获取这些数据。由于Redis提供了极快的访问速度,如果数据存在于Redi…...
统计学习算法——逻辑斯谛回归
内容来自B站Up主:动画讲编程https://www.bilibili.com/video/BV1CR4y1L7RC、风中摇曳的小萝卜https://www.bilibili.com/video/BV17r4y137bW,仅为个人学习所用。 极大似然估计 几率、概率与似然 几率是指某个事件发生的可能性与不发生的可能性之比&am…...
设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo
1.策略模式 好处:动态切换算法或行为场景:实现同一功能用到不同的算法时和简单工厂对比:简单工厂是通过参数创建对象,调用同一个方法(实现细节不同);策略模式是上下文切换对象,调用…...
C51交通控制系统的设计与实现
实验要求: 本题目拟设计一个工作在十字路口的交通信号灯控制系统,设东西方向为主干道A,南北方向为辅助干道B。要求:(1)用发光二极管模拟交通灯信号;(2)灵活控制主、辅干…...
css 实现自定义虚线
需求: ui 画的图是虚线,但是虚线很宽正常的border 参数无法做到 进程: 尝试使用 border:1px dashed 发现使用这个虽然是虚线但是很短密密麻麻的 这并不是我们想要的那就只能换方案 第一个最简单,让ui 画一个图然…...
网络协议基础--协议分层
一.协议概述 1.TCP/IP 传输协议概述 TCP/IP 传输协议,即传输控制 / 网络协议,也被称作网络通讯协议。它是网络中使用的最基本通信协议,对互联网中各部分进行通信的标准和方法予以规定。通常所说的 TCP/IP 协议并非仅指 TCP 和 IP 两个协议&a…...
iOS - TLS(线程本地存储)
从源码中,详细总结 TLS (Thread Local Storage) 的实现: 1. TLS 基本结构 // TLS 的基本结构 struct tls_data {pthread_key_t key; // 线程本地存储的键void (*destructor)(void *); // 清理函数 };// 自动释放池的 TLS class Autorelease…...
主链和Layer2之间资产转移
主链和Layer2之间资产转移 主链和Layer2之间资产转移是实现Layer2技术的关键环节,以下是资产转移的流程、流行解决方案及原理: 资产从主链转移到Layer2 用户在主链上发起一笔交易,将资产发送到一个特定的智能合约地址,这个合约是主链与Layer2之间的桥梁。智能合约会锁定用…...
深度学习-算法优化与宇宙能量梯度分布
在当今迅速发展的科技世界中,算法优化和能量分布问题已成为研究的热点,尤其是在人工智能、机器学习和物理科学领域。算法优化通常涉及提高计算效率和降低资源消耗,而宇宙能量梯度分布则涉及宇宙中能量的分布和流动方式。两者看似是完全不同的…...
《Java核心技术II》实现服务器
实现服务器 这节实现简单服务器,可以向客户端发送信息。 服务器套接字 ServerSocket用于建立套接字 var s new ServerSocket(8189); 建立一个监听端口8189的服务器。 Socket incoming s.accept(); 此对象可以得到输入流和输出流。 InputStream inStream incomin…...
登上Nature!交叉注意力机制 发顶会流量密码!
在深度学习领域,交叉注意力融合技术正迅速崛起,并成为处理多模态数据的关键工具。这一技术通过有效地整合来自不同模态的信息,使得模型能够更好地理解和推理复杂的数据关系。 随着多模态数据的日益普及,如图像、文本和声音等&…...
Windows 正确配置android adb调试的方法
下载适用于 Windows 的 SDK Platform-Tools https://developer.android.google.cn/tools/releases/platform-tools?hlzh-cn 设置系统变量,路径为platform-tools文件夹的绝对路径 点击Path添加环境变量 %adb%打开终端输入adb shell 这就成功了!...
leetcode刷题记录(五十六)——53. 最大子数组和
(一)问题描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,…...
SQL BETWEEN 操作符
SQL BETWEEN 操作符 SQL中的BETWEEN操作符用于选取介于两个值之间的数据范围。这些值可以是数字、文本或日期。BETWEEN操作符是SQL中非常实用的一个功能,它可以帮助我们快速地筛选出符合特定条件的数据记录。 BETWEEN操作符的基本用法 BETWEEN操作符的基本语法如…...
分布式 IO 模块:引领立体车库迈向智能化新时代
在城市空间愈发珍贵的当下,立体车库作为高效利用空间的停车解决方案,正日益普及。而明达技术MR30分布式 IO 模块的应用,如同为立体车库注入了智能 “芯” 动力,让停车变得更加便捷、高效、智能。 MR30分布式 IO 模块,作…...
《C++11》深入剖析正则表达式库:解锁文本处理的高效之道
在现代编程领域,文本处理是一项不可或缺的任务,而正则表达式无疑是这一领域的强大利器。C11标准库的引入,为C开发者带来了正则表达式库,极大地丰富了C在文本处理方面的能力。本文将全方位、多角度地深入探讨C11正则表达式库&#…...
Mongodb相关内容
Mongodb相关内容 1、Windows平台安装2、Linux平台安装3、基本常用命令文档更新删除文档分页查询索引 pymongo操作 客户端下载:https://download.csdn.net/download/guoqingru0311/90273435 1、Windows平台安装 方式一: 方式2: 方式3&#…...
United States of America三种表示
"United States of America", "United States", 和 "America" 都表示美国,但它们的使用场景和背景略有不同。以下是关于为什么这些名称可以合在一起表示美国的详细解释: 1. "United States of America" 全称&a…...
【Redis】Redis特性及其应用场景
目录 Redis特性 在内存中存储数据 可编程性 可扩展性 持久化 集群 高可用 补充特性 Redis的应用场景 数据库 缓存 会话存储 消息队列中间件 Redis特性 Redis是一个在内存中存储数据的中间件,用于作为数据库、数据缓存。Redis在分布式系统中有着较…...
Vue 使用blob下载文件,打开文件,文件是损毁的
文章目录 问题分析解决 问题 如图所示,在进行图片下载时下载的文件显示图片已被损 分析 代码如下: import axios from axios; async function downloadImage1(link, name) {try {const response await axios.get(link, {responseType: blob, // 设置响…...
Android 通过systrace如何快速找到app的刷新率
1. 如何抓取systrace: 方法一 andrdoid11以及以上的android版本都支持使用perfetto的方式抓取systrace,简单好用。 adb shell perfetto --buffer 512mb --time 10s --out /data/misc/perfetto-traces/perfetto_trace gfx input view wm am hal res dalv…...
vulnhub靶场【Raven系列】之2 ,对于mysql udf提权的复习
前言 靶机:Raven-2,IP地址为192.168.10.9 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 文章所用靶机来自vulnhub,可通过官网下载,或者通过链接:https://pan.quark.cn/s/a65…...
【单片机开发 - STM32(H7)】启动流程、方式、烧录方式详解
如侵权,联系删,个人总结学习用 参考资料:(最末尾有我的原生笔记,那个格式规范点) 安富莱 ARM汇编伪指令详解-CSDN博客 【STM32】STM32内存映射以及启动过程(超详细过程)-CSDN博客…...
[手机Linux] ubuntu 错误解决
Ubuntu: 1,ttyname failed: Inappropriate ioctl for device 将 /root/.profile 文件中的 mesg n || true 改为如下内容。 vim /root/.profile tty -s && mesg n || true 2,Errors were encountered while processing: XXX XXXX sudo apt-get --purge remove xxx…...
springCloudGateway+nacos自定义负载均衡-通过IP隔离开发环境
先说一下想法,小公司开发项目,参考若依框架使用的spring-cloud-starter-gateway和spring-cloud-starter-alibaba-nacos, 用到了nacos的配置中心和注册中心,有多个模块(每个模块都是一个服务)。 想本地开发,…...
MyBatis-增删改查操作一些细节
目录 删除 新增 修改 查询 小结: 删除功能 需求:根据ID删除用户信息 SQL:delete from user where id 5; Mapper接口方法(注意这里不是实现类): /*** 根据id删除*/ Delete("delete from user wher…...
windows 极速安装 Linux (Ubuntu)-- 无需虚拟机
1. 安装 WSL 和 Ubuntu 打开命令行,执行 WSL --install -d ubuntu若报错,则先执行 WSL --update2. 重启电脑 因安装了子系统,需重启电脑才生效 3. 配置 Ubuntu 的账号密码 打开 Ubuntu 的命令行 按提示,输入账号,密…...
【学习笔记】各种强化学习环境
0. 写在前面 0.1 强化学习综述/资料(更新中) 鹏程实验室: 中文报道:学术分享丨具身智能综述:鹏城实验室&中大调研近400篇文献,英文原文:Aligning Cyber Space with Physical World…...
统计有序矩阵中的负数
统计有序矩阵中的负数 描述 给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。 请你统计并返回 grid 中 负数 的数目 示例 1: 输入:grid [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]…...
【已解决】git clone报错:Failed to connect to github.com port 443: Timed out
1.问题原因1 报错信息1: fatal: unable to access https://github.com/microsoft/xxx/: Failed to connect to github.com port 443: Timed out 报错信息2: fatal: unable to access https://github.com/xxx/xx/: OpenSSL SSL_read: Connection was …...
Android SystemUI——使用Dagger2加载组件(四)
SystemUI 是 Android 系统中的一个重要模块,负责绘制系统栏(如状态栏、导航栏)、锁屏、快捷设置等用户界面元素。由于其复杂性,良好的架构设计和依赖管理对于保持代码的可维护性和扩展性至关重要。这就是 Dagger2 在此发挥重要作用的地方。 一、Dagger2介绍 Dagger2 是一个…...
Lesson 109 A good idea
Lesson 109 A good idea 词汇 idea n. 主意,想法 复数:ideas 用法:口语:Good idea! 好主意! Big idea! 高见!好主意! Great idea! 好主意 Bad idea! 坏主…...
网络安全-RSA非对称加密算法、数字签名
数字签名非常普遍: 了解数字签名前先了解一下SHA-1摘要,RSA非对称加密算法。然后再了解数字签名。 SHA-1 SHA-1(secure hash Algorithm )是一种 数据加密算法。该算法的思想是接收一段明文,然后以一种不可逆的方式将…...
自动化办公|xlwings简介
xlwings 是一个开源的 Python 库,旨在实现 Python 与 Microsoft Excel 的无缝集成。它允许用户使用 Python 脚本自动化 Excel 操作,读取和写入数据,执行宏,甚至调用 VBA 脚本。这使得数据分析、报告生成和其他与 Excel 相关的任务…...
C#使用OpenTK绘制3D可拖动旋转图形三棱锥
接上篇,绘制着色矩形 C#使用OpenTK绘制一个着色矩形-CSDN博客 上一篇安装OpenTK.GLControl后,这里可以直接拖动控件GLControl 我们会发现GLControl继承于UserControl //// 摘要:// OpenGL-aware WinForms control. The WinForms designer will always call the default//…...
【网络云SRE运维开发】2025第3周-每日【2025/01/14】小测-【第13章ospf路由协议】理论和实操
文章目录 选择题(10道)理论题(5道)实操题(5道) 【网络云SRE运维开发】2025第3周-每日【2025/01/14】小测-【第12章ospf路由协议】理论和实操 选择题(10道) 在OSPF协议中,…...
计算机网络 (34)可靠传输的工作原理
前言 计算机网络可靠传输的工作原理主要依赖于一系列协议和机制,以确保数据在传输过程中能够准确无误地到达目的地。 一、基本概念 可靠传输指的是数据链路层的发送端发送什么,在接收端就收到什么,即保证数据的完整性、正确性和顺序性。由于网…...
提高互联网Web安全性:避免越权漏洞的技术方案
目录 一、越权漏洞概述 二、常见的越权漏洞类型 三、越权漏洞的影响 四、越权漏洞的技术解决方案 一、越权漏洞概述 越权(Authorization Bypass)类漏洞是指在系统中,攻击者通过绕过身份验证或访问控制,获取本不应访问的资源或…...
c语言 --- 字符串
创建字符串 1. 使用字符数组创建字符串 #include <stdio.h>int main() {char str[20] "Hello, world!";str[0] h; // 修改字符串的第一个字符printf("%s\n", str); // 输出:hello, world!return 0; }解释: 数组大小 20 表…...
Linux探秘坊-------1.系统核心的低语:基础指令的奥秘解析(3)
1.zip/unzip指令 语法: zip 压缩⽂件.zip ⽬录或⽂件 功能:将⽬录或⽂件压缩成zip格式 常⽤选项: -r:递归处理,将指定⽬录下的 所有⽂件和⼦⽬录⼀并处理 example: 1.事前准备 建立以下文件与目录: 2.压缩test 目…...
Java中网络编程的学习
目录 网络编程概述 网络模型 网络通信三要素: IP 端口号 通信协议 IP地址(Internet Protocol Address) 端口号 网络通信协议 TCP 三次握手 四次挥手 UDP TCP编程 客户端Socket的工作过程包含以下四个基本的步骤: 服务器程序…...
微服务的CAP定理与数据一致性抉择
分布式系统中的CAP定理,包括一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)三个核心要素。 微服务是分布式系统的一种表现形式,以及用户对于系统是分…...
正则表达式 - 简介
正则表达式 - 简介 正则表达式(Regular Expression,简称Regex)是一种用于处理字符串的强大工具,它允许我们按照特定的模式(pattern)来搜索、匹配、查找和替换文本。正则表达式广泛应用于各种编程语言和工具…...
MySQL:表的内外连接
目录 1.内连接 2.左外连接和右外连接 178. 分数排名 - 力扣(LeetCode) 1.内连接 内连接就是两张表做笛卡尔积,再加上一个筛选条件。 这两个sql语句是一样的。 2.左外连接和右外连接 左外连接就是左表必须是完全显示,即使筛选…...