【笔记】树状数组
【笔记】树状数组 目录
- 简介
- 引入
- 1. 直接暴力
- 2. 维护前缀和数组
- 总结
- 定义
- 前置知识: lowbit \operatorname{lowbit} lowbit 操作
- 区间的表示方法
- 操作
- 单点修改
- 前缀和查询
- 任意区间查询
- 例题1: 单点修改,区间查询
- 例题2: 区间修改,单点查询
- 例题3: 区间修改,区间查询
- (后附极限卡常代码,70ms,较优解)
简介
树状数组是一种树形数据结构,支持在 O ( log n ) O(\log n) O(logn) 的时间复杂度内进行 单点修改 和 查询前缀和 的操作。
- 优点:常数小,码量小,操作灵活简便。
- 缺点:只能用来维护具有 结合律 且 可差分 的信息。例如:区间和、积等,而不能维护区间最大(最小)值。
引入
现在想要让你实现两个操作:
- 单点修改
- 查询 [ 1 , x ] [1,x] [1,x] 的和
在没有学过树状数组的时候你会怎么做?
1. 直接暴力
单点修改虽然方便,但前缀和是 O ( n ) O(n) O(n) 复杂度。
2. 维护前缀和数组
这样做虽然查询是 O ( 1 ) O(1) O(1) 了,但单点修改又是 O ( n ) O(n) O(n)。
总结
- 暴力
- 修改: O ( 1 ) O(1) O(1)
- 查询: O ( n ) O(n) O(n)
- 前缀和
- 修改: O ( n ) O(n) O(n)
- 查询: O ( 1 ) O(1) O(1)
那么我们不妨考虑一个折中的办法,两种操作都是 O ( log n ) O(\log n) O(logn) 的复杂度。
定义
注:这里的数值表示的是该区间所有元素的和,也就是这个节点左下方的所有直接相关节点的总和。
例如:权值为 31 31 31 的节点表示的是权值分别为 19 , 10 , 1 19,10,1 19,10,1 的节点以及原数组中下表为 8 8 8 的元素之和。
显然,我们能求出原数组为
[ 8 , 6 , 1 , 4 , 5 , 5 , 1 , 1 , 3 , 2 , 1 , 4 , 9 , 0 , 7 , 4 ] [8,6,1,4,5,5,1,1,3,2,1,4,9,0,7,4] [8,6,1,4,5,5,1,1,3,2,1,4,9,0,7,4]
这里插一句话:树状数组可以近似看成线段树去掉所有右儿子构成的树。
前置知识: lowbit \operatorname{lowbit} lowbit 操作
一个二进制数的 lowbit \operatorname{lowbit} lowbit 值就是这个数末尾第一个非零的位置的权值。
举个例子: 10001 0 ( 2 ) 100010_{(2)} 100010(2)
这个数的 lowbit \operatorname{lowbit} lowbit 值是 1 0 ( 2 ) 10_{(2)} 10(2),即 2 ( 10 ) 2_{(10)} 2(10)。
那么这个怎么用代码实现呢?
void lowbit(int x)
{return x & -x;
}
什么?你问为什么这么简单??
这都不知道,赶紧退役吧 h h \color{white}{这都不知道,赶紧退役吧hh} 这都不知道,赶紧退役吧hh
这里涉及到补码的概念。
一个二进制数的补码就是其二进制上的每一位都按位取反之后再 + 1 +1 +1。
还是那个数: 10001 0 ( 2 ) 100010_{(2)} 100010(2)
先按位取反: 01110 1 ( 2 ) 011101_{(2)} 011101(2)
再加一: 1111 0 ( 2 ) 11110_{(2)} 11110(2)
我们惊奇地发现,它们的后两位竟然是一样的!!!
我们把它们进行按位与运算 &
,得到的结果是 1 0 ( 2 ) 10_{(2)} 10(2),即 2 ( 10 ) 2_{(10)} 2(10),与我们刚才进行手动 lowbit \operatorname{lowbit} lowbit 运算的结果相同。
在计算机的运算过程中,由于是按照补码储存的,所以我们需要的 ~x + 1
就可以写成 -x
。
因此 lowbit \operatorname{lowbit} lowbit 才能写成 x & -x
。
区间的表示方法
对于每个标号为 x x x 的节点,我们发现它父节点的标号为 x + lowbit x x+\text{lowbit}\ x x+lowbit x。
而每个区间的范围都是 ( x − lowbit ( x ) , x ] (x-\text{lowbit}(x),x] (x−lowbit(x),x]。
操作
单点修改
对于每个被修改的点,我们需要找到它的所有祖先节点并都进行修改操作。
考虑到它们标号的关系,我们只要每次加一个 lowbit(x) \text{lowbit(x)} lowbit(x) 就能找到所有祖先节点了。
代码:
void add(int x, int c) // 将第 x 个数加 c
{for (int i = x; i <= n; i += lowbit(i))tr[i] += c;
}
前缀和查询
实践是检验真理的唯一标准。
经过我们的实践,找到该节点前面的所有节点,只需要每次减 lowbit(x) \text{lowbit(x)} lowbit(x) 即可。
代码:
void query(int x) // 查询 1~x 的和
{int res = 0;for (int i = x; i; i -= lowbit(i))res += tr[i];return res;
}
任意区间查询
我们都知道前缀和的性质。
∑ i = l r w i = ∑ i = 1 r w i − ∑ i = 1 l − 1 w i \sum_{i=l}^{r}w_i=\sum_{i=1}^{r}w_i-\sum_{i=1}^{l-1}w_i i=l∑rwi=i=1∑rwi−i=1∑l−1wi
代码:
void Query(int l, int r) // 查询 [l,r] 的和
{return query(r) - query(l - 1);
}
例题1: 单点修改,区间查询
原题链接:P3374 【模板】树状数组 1
操作和上面的相同,直接上代码:
#include <iostream>using namespace std;const int N = 500010;int n, m;
int a[N];
int tr[N];int lowbit(int x)
{return x & -x;
}void add(int x, int c)
{for (int i = x; i <= n; i += lowbit(i))tr[i] += c;
}int sum(int x)
{int res = 0;for (int i = x; i; i -= lowbit(i))res += tr[i];return res;
}int main()
{int op, x, y;scanf("%d%d", &n, &m);for (int i = 1; i <= n; i ++ )scanf("%d", &a[i]), add(i, a[i]);while (m -- ){scanf("%d%d%d", &op, &x, &y);if (op == 1) add(x, y);else printf("%d\n", sum(y) - sum(x - 1));}return 0;
}
例题2: 区间修改,单点查询
原题链接:P3368 【模板】树状数组 2
同一道题,思路已经在昨天的 【笔记】线段树 里面讲了,无非是维护一个差分数组。
代码:
#include <iostream>using namespace std;const int N = 500010;int n, m;
int a[N], b[N];
int tr[N];int lb(int x)
{return x & -x;
}void add(int x, int v)
{for (int i = x; i <= n; i += lb(i))tr[i] += v;
}int q(int x)
{int res = 0;for (int i = x; i; i -= lb(i))res += tr[i];return res;
}int main()
{cin >> n >> m;for (int i = 1; i <= n; i ++ )cin >> a[i], b[i] = a[i] - a[i - 1], add(i, b[i]);while (m -- ){int op, x, y, k;cin >> op >> x;if (op == 1){cin >> y >> k;add(x, k), add(y + 1, -k);}else cout << q(x) << endl;}
}
例题3: 区间修改,区间查询
原题链接:P3372 【模板】线段树 1
不要说我用线段树的题练习树状数组,我找不到树状数组的模板题才用的这个
考虑用树状数组 tr[]
维护差分数组
则求原数组的前缀和
{ a 1 = d 1 a 2 = d 1 + d 2 a 3 = d 1 + d 2 + d 3 . . . . . . a n = d 1 + d 2 + . . . + d n \left\{\begin{matrix} a_1& =& d_1& & & & & & & \\ a_2& =& d_1& +& d_2& & & & & \\ a_3& =& d_1& +& d_2& +& d_3& & & \\ .& .& .& .& .& .& & & & \\ a_n& =& d_1& +& d_2& +& ...& +& d_n& \\ \end{matrix}\right. ⎩ ⎨ ⎧a1a2a3.an===.=d1d1d1.d1++.+d2d2.d2+.+d3...+dn
s i = ∑ i = 1 n a i = { d 1 d 1 + d 2 d 1 + d 2 + d 3 . . . . . . d 1 + d 2 + . . . + d n s_i=\sum_{i=1}^{n}a_i=\left\{\begin{matrix} d_1& & & & & & & \\ d_1& +& d_2& & & & & \\ d_1& +& d_2& +& d_3& & & \\ .& .& .& .& .& .& & & & \\ d_1& +& d_2& +& ...& +& d_n& \\ \end{matrix}\right. si=i=1∑nai=⎩ ⎨ ⎧d1d1d1.d1++.+d2d2.d2+.+d3.....+dn
我们考虑把后面的矩阵补全:
则
s i = ( n + 1 ) × ∑ i = 1 n d i − ∑ i = 1 n ( i × d i ) s_i=(n+1) \times \sum_{i=1}^{n}d_i-\sum_{i=1}^{n}(i \times d_i) si=(n+1)×i=1∑ndi−i=1∑n(i×di)
所以我们需要两个树状数组,tr1[]
维护差分数组,tr2[]
维护 i × d i i \times d_i i×di
代码:
#include <iostream>using namespace std;typedef long long LL;const LL N = 1000010;LL n, m;
LL a[N];
LL t1[N], t2[N];inline LL lowbit(LL x)
{return x & -x;
}inline void add(LL t[], LL x, LL c)
{for (LL i = x; i <= n; i += lowbit(i))t[i] += c;
}inline LL sum(LL t[], LL x)
{LL res = 0;for (LL i = x; i; i -= lowbit(i))res += t[i];return res;
}inline LL psum(LL x)
{return sum(t1, x) * (x + 1) - sum(t2, x);
}int main()
{scanf("%lld%lld", &n, &m);for (LL i = 1; i <= n; i ++ ) scanf("%lld", &a[i]);for (LL i = 1; i <= n; i ++ ){LL b = a[i] - a[i - 1];add(t1, i, b);add(t2, i, b * i);}while (m -- ){char op[2];LL l, r, d;scanf("%s%lld%lld", op, &l, &r);if (op[0] == '2'){printf("%lld\n", psum(r) - psum(l - 1));}else{scanf("%lld", &d);add(t1, l, d), add(t2, l, l * d);add(t1, r + 1, -d), add(t2, r + 1, -d * (r + 1));}}return 0;
}
最后,如果觉得对您有帮助的话,点个赞再走吧!
(后附极限卡常代码,70ms,较优解)
#define qwq optimize
#pragma GCC qwq(1)
#pragma GCC qwq(2)
#pragma GCC qwq(3)
#pragma GCC qwq("Ofast")
#pragma GCC qwq("inline")
#pragma GCC qwq("-fgcse")
#pragma GCC qwq("-fgcse-lm")
#pragma GCC qwq("-fipa-sra")
#pragma GCC qwq("-ftree-pre")
#pragma GCC qwq("-ftree-vrp")
#pragma GCC qwq("-fpeephole2")
#pragma GCC qwq("-ffast-math")
#pragma GCC qwq("-fsched-spec")
#pragma GCC qwq("unroll-loops")
#pragma GCC qwq("-falign-jumps")
#pragma GCC qwq("-falign-loops")
#pragma GCC qwq("-falign-labels")
#pragma GCC qwq("-fdevirtualize")
#pragma GCC qwq("-fcaller-saves")
#pragma GCC qwq("-fcrossjumping")
#pragma GCC qwq("-fthread-jumps")
#pragma GCC qwq("-funroll-loops")
#pragma GCC qwq("-fwhole-program")
#pragma GCC qwq("-freorder-blocks")
#pragma GCC qwq("-fschedule-insns")
#pragma GCC qwq("inline-functions")
#pragma GCC qwq("-ftree-tail-merge")
#pragma GCC qwq("-fschedule-insns2")
#pragma GCC qwq("-fstrict-aliasing")
#pragma GCC qwq("-fstrict-overflow")
#pragma GCC qwq("-falign-functions")
#pragma GCC qwq("-fcse-skip-blocks")
#pragma GCC qwq("-fcse-follow-jumps")
#pragma GCC qwq("-fsched-interblock")
#pragma GCC qwq("-fpartial-inlining")
#pragma GCC qwq("no-stack-protector")
#pragma GCC qwq("-freorder-functions")
#pragma GCC qwq("-findirect-inlining")
#pragma GCC qwq("-fhoist-adjacent-loads")
#pragma GCC qwq("-frerun-cse-after-loop")
#pragma GCC qwq("inline-small-functions")
#pragma GCC qwq("-finline-small-functions")
#pragma GCC qwq("-ftree-switch-conversion")
#pragma GCC qwq("-fqwq-sibling-calls")
#pragma GCC qwq("-fexpensive-optimizations")
#pragma GCC qwq("-funsafe-loop-optimizations")
#pragma GCC qwq("inline-functions-called-once")
#pragma GCC qwq("-fdelete-null-pointer-checks")
#include <iostream>
#include <cstdio>#define lb(x) (x & (-x))using namespace std;typedef long long LL;const LL N = 100010;LL n, m;
LL a[N];
LL t1[N], t2[N];char *p1, *p2, buf[N];
#define nc() (p1 == p2 && (p2 = (p1 = buf) +\
fread(buf, 1, N, stdin), p1 == p2) ? EOF : *p1 ++ )
LL read()
{LL x = 0, f = 1;char ch = nc();while (ch < 48 || ch > 57){if (ch == '-') f = -1;ch = nc();}while (ch >= 48 && ch <= 57)x = (x << 3) + (x << 1) + (ch ^ 48), ch = nc();return x * f;
}char obuf[N], *p3 = obuf;
#define putchar(x) (p3 - obuf < N) ? (*p3 ++ = x) :\
(fwrite(obuf, p3 - obuf, 1, stdout), p3 = obuf, *p3 ++ = x)
inline void write(LL x)
{if (!x){putchar('0');return;}LL len = 0, k1 = x, c[40];if (k1 < 0) k1 = -k1, putchar('-');while (k1) c[len ++ ] = k1 % 10 ^ 48, k1 /= 10;while (len -- ) putchar(c[len]);
}inline void add(LL t[], LL x, LL c)
{for (LL i = x; i <= n; i += lb(i))t[i] += c;
}inline LL sum(LL t[], LL x)
{LL res = 0;for (LL i = x; i; i -= lb(i))res += t[i];return res;
}inline LL psum(LL x)
{return sum(t1, x) * (x + 1) - sum(t2, x);
}int main()
{n = read(), m = read();for (LL i = 1; i <= n; i ++ ) a[i] = read();for (LL i = 1; i <= n; i ++ ){LL b = a[i] - a[i - 1];add(t1, i, b);add(t2, i, b * i);}LL op, l, r, d;while (m -- ){op = read(), l = read(), r = read();if (op == 2) write(psum(r) - psum(l - 1)), putchar(10);else{d = read();add(t1, l, d), add(t2, l, l * d);add(t1, r + 1, -d), add(t2, r + 1, -d * (r + 1));}}fwrite(obuf, p3 - obuf, 1, stdout);return 0;
}
相关文章:

【笔记】树状数组
【笔记】树状数组 目录 简介引入1. 直接暴力2. 维护前缀和数组总结 定义前置知识: lowbit \operatorname{lowbit} lowbit 操作区间的表示方法操作单点修改前缀和查询任意区间查询 例题1: 单点修改,区间查询例题2: 区间修改,单点查询例题3:…...

vue全局组件自动注册直接使用,无需单独先引用注册再使用
目录结构: 本案例是在根目录下components文件夹测试的,文件位置项目内任意,确保在main.js挂载路径正确即可 1、新建文件夹(名字随意)zxy_components (放自己组件的地方) 2、在zxy_components文件夹下 !新建…...
【HarmonyOS】@ohos.request 上传下载的那些事儿
【关键字】 ohos.request、上传下载 【写在前面】 在进行HarmonyOS应用开发时,可能需要进行上传或下载文件功能开发,本文章主要进行上传下载相关功能介绍和一些注意事项及FAQ。 【上传开发步骤】 步骤1:上传下载接口需要申请ohos.permis…...

github版面混乱加载不出的解决办法
最近出现打开github 界面加载不成功,网页访问乱码,打开chrome的检查发现 github的github.githubassets.com 拒绝访问, 解法: 1.先打开hosts文件所在的目录C:\Windows\System32\drivers\etc 2.右键点击hosts文件-选择用记事本或者…...

dotNet 之数据库sqlite
Sqlite3是个特别好的本地数据库,体积小,无需安装,是写小控制台程序最佳数据库。NET Core是同样也是.NET 未来的方向。 **硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 D…...

走近ChatGPT与类似产品:原理解析与比较
目录 1. 引言1.1 技术的进步与自然语言处理1.2 ChatGPT的崭新概念 2. ChatGPT: 一览众山小2.1 GPT-3.5架构简介2.2 ChatGPT的学习与训练2.3 文本生成的工作原理 3. 市场上类似产品调研3.1 对话式人工智能产品分类3.2 文心一言3.3 讯飞星火 4. 应用前景与局限性展望4.1 ChatGPT的…...

HarmonyOS SDK开放能力,服务鸿蒙生态建设,打造优质应用体验
华为开发者大会2023(HDC.Together)于8月4日至6日在东莞松山湖举行,在HarmonyOS端云开放能力技术分论坛上,华为为广大开发者们介绍了HarmonyOS SDK开放能力在基础开发架构、功能特性等方面的变化之处,通过将常见的通用能…...

数字经济对产业结构升级和创业增长的影响(2011-2021年)
参照刘翠花(2022)的做法,对来自中国人口科学《数字经济对产业结构升级和创业增长的影响》一文中的基准回归部分进行复刻。文章从理论层面分析数字经济发展对产业结构升级、创业增长的影响及其机理,并利用2011-2021年中国省级面板数…...

GPT-4助力数据分析:提升效率与洞察力的未来关键技术 | 京东云技术团队
摘要 随着大数据时代的到来,数据分析已经成为企业和组织的核心竞争力。然而,传统的数据分析方法往往无法满足日益增长的数据分析需求的数量和复杂性。在这种背景下,ChatGPT-4作为一种先进的自然语言处理技术,为数据分析带来了革命…...

Zabbix6 对接飞书告警
文章目录 Zabbix对接飞书告警背景创建飞书群组Zabbix配置创建告警媒介类型创建动作用户关联飞书告警 Zabbix对接飞书告警 背景 运维 你看下他的进程是不是挂了,之前在9点28分有发消息的,这次没有发消息 哐哐哐的去看了一通,确实有个进程之前…...

Javascript异步编程的4种方法
你可能知道,Javascript语言的执行环境是"单线程"(single thread)。 所谓"单线程",就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一…...

【MySQL】表的内外连接
目录 一、内连接 二、外连接 1、左外连接 2、右外连接 一、内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。 语法: select 字段 from 表1 i…...

详解Mysql——第一篇/连接查询
mysql的连接查询,相必在网上都能找到很多的教程,博主今天不做老话常谈,不走重复路线 1.建表 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id) – –课程编…...
uniapp获取屏幕宽度时 获取不到移动设备中内容盒子宽度
首先 :我使用的是uniapp vue3语法: 问题: 我出现这个问题是IOS 设备发现的,data.boxWidth为0 代码: const initCreated () > {const query uni.createSelectorQuery().in(instance.proxy);const el query.select…...
篇十二:代理模式:控制对象访问
篇十二:“代理模式:控制对象访问” 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料,…...
P1657 选书
1:思路:一看数据,嗯....!,爆搜嘛?,看一眼题目,嗯!!!,爆搜! 配上俺的无敌小剪枝,按下拿下! 2:暴力枚举每个人获…...
代码随想录第46天 | 139. 单词拆分、多重背包
139. 单词拆分 确定dp数组以及下标的含义 dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。 确定递推公式 如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是tru…...

Unreal View Model结合GAS使用
这个东西真的难用,各种问题,记录下 官方文档 bilibili教学 开启插件 插件开启 Viewmodel: build.cs内PublicDependencyModuleNames加上ModelViewViewModel 创建ViewModel类 #pragma once#include "CoreMinimal.h" #include &quo…...

Spring-Cloud-Loadblancer详细分析_2
LoadBalancerClients 终于分析到了此注解的作用,它是实现不同服务之间的配置隔离的关键 Configuration(proxyBeanMethods false) Retention(RetentionPolicy.RUNTIME) Target({ ElementType.TYPE }) Documented Import(LoadBalancerClientConfigurationRegistrar…...

uniapp 左右滑动切换页面并切换tab
实现效果如图 要实现底部内部的左右滑动切换带动上方tab栏的切换,并且下方内容要实现纵向滚动 ,所以需要swiper,swiper-item,scroll-view组合使用 tab栏部分 <view class"tabs"><view class"tab_item" v-for&…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...