<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
對於線段樹,若要求對區間中的所有點都進行更新,可以引入懶操作。
懶操作包括區間更新和區間查詢操作。
對 [l,r] 區間進行更新,例如將 [l,r] 區間所有元素都更新為 v,步驟如下。
1.若當前節點區間被查詢區間[l,r]覆蓋,則僅對該節點進行更新並做懶標記,表示該節點已被更新,對該節點的子節點暫不更新。
2.判斷是在左子樹中查詢還是在右子樹中查詢。在查詢過程中,若當前節點帶有懶標記,則將懶標記傳給子節點(將當前節點的懶標記清除,將子節點更新並做懶標記),繼續查詢。
3.在返回時更新最值。
帶有懶標記的區間查詢和普通的區間查詢有所不同,在查詢過程中若遇到節點有懶標記,則下傳懶標記,繼續查詢。
10
5 3 7 2 12 1 6 4 8 15
3 7 25
1 10
package com.platform.modules.alg.alglib.p85; public class P85 { public String output = ""; private final int maxn = 100005; private final int inf = 0x3f3f3f3f; private int n; private int a[] = new int[maxn]; private node tree[] = new node[maxn * 4]; // 樹結點儲存陣列 public P85() { for (int i = 0; i < tree.length; i++) { tree[i] = new node(); } } void lazy(int k, int v) { tree[k].mx = v; // 更新最值 tree[k].lz = v; // 做懶標記 } // 向下傳遞懶標記 void pushdown(int k) { lazy(2 * k, tree[k].lz); // 傳遞給左孩子 lazy(2 * k + 1, tree[k].lz); // 傳遞給右孩子 tree[k].lz = -1; // 清除自己的懶標記 } // 建立線段樹,k表示儲存下標,區間[l,r] void build(int k, int l, int r) { tree[k].l = l; tree[k].r = r; tree[k].lz = -1; // 初始化懶操作 if (l == r) { tree[k].mx = a[l]; return; } int mid, lc, rc; mid = (l + r) / 2; // 劃分點 lc = k * 2; // 左孩子儲存下標 rc = k * 2 + 1; // 右孩子儲存下標 build(lc, l, mid); build(rc, mid + 1, r); tree[k].mx = Math.max(tree[lc].mx, tree[rc].mx); // 結點的最大值等於左右孩子最值的最大值 } // 將區間 [l,r] 修改更新為 v void update(int k, int l, int r, int v) { // 找到該區間 if (tree[k].l >= l && tree[k].r <= r) { lazy(k, v); // 更新並做懶標記 return; } if (tree[k].lz != -1) pushdown(k); // 懶標記下移 int mid, lc, rc; mid = (tree[k].l + tree[k].r) / 2; // 劃分點 lc = k * 2; // 左孩子儲存下標 rc = k * 2 + 1; // 右孩子儲存下標 if (l <= mid) update(lc, l, r, v); // 到左子樹更新 if (r > mid) update(rc, l, r, v);// 到右子樹更新 tree[k].mx = Math.max(tree[lc].mx, tree[rc].mx); // 返回時修改更新最值 } // 求區間 [l,r] 的最值 int query(int k, int l, int r) { int Max = -inf; if (tree[k].l >= l && tree[k].r <= r) // 找到該區間 return tree[k].mx; if (tree[k].lz != -1) pushdown(k); // 懶標記下移 int mid, lc, rc; mid = (tree[k].l + tree[k].r) / 2; // 劃分點 lc = k * 2; // 左孩子儲存下標 rc = k * 2 + 1; // 右孩子儲存下標 if (l <= mid) Max = Math.max(Max, query(lc, l, r)); // 到左子樹查詢 if (r > mid) Max = Math.max(Max, query(rc, l, r)); // 到右子樹查詢 return Max; } public String cal(String input) { int l, r; int i, v; String[] line = input.split("n"); n = Integer.parseInt(line[0]); // 第 1 行:10 String[] nums = line[1].split(" "); // 第 2 行:5 3 7 2 12 1 6 4 8 15 for (i = 1; i <= n; i++) a[i] = Integer.parseInt(nums[i - 1]); build(1, 1, n); // 建立線段樹 // 輸入查詢最值的區間 [l,r] 1 10 String[] range = line[2].split(" "); l = Integer.parseInt(range[0]); r = Integer.parseInt(range[1]); // 求區間[l..r]的最值 output += query(1, l, r) + "n"; // 輸入更新的區間值 l r v 第 3 行: 3 7 25 String[] change = line[3].split(" "); l = Integer.parseInt(change[0]); r = Integer.parseInt(change[1]); v = Integer.parseInt(change[2]); // 將區間 [l,r] 修改更新為 v update(1, l, r, v); // 求區間[l..r]的最值 第 4 行:1 10 range = line[4].split(" "); l = Integer.parseInt(range[0]); r = Integer.parseInt(range[1]); // 求區間 [l..r] 的最值 output += query(1, l, r) + "n"; return output; } } // 結點 class node { int l; // l 表示區間左右端點 int r; // r 表示區間左右端點 int mx; // mx表示區間[l,r]的最值 int lz; // lz 懶標記 }
以上就是Java資料結構之線段樹中的懶操作詳解的詳細內容,更多關於Java線段樹 懶操作的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45