最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java數(shù)據(jù)結(jié)構(gòu)之線段樹中的懶操作詳解

 更新時間:2022年10月04日 08:16:46   作者:chengqiuming  
對于線段樹,若要求對區(qū)間中的所有點(diǎn)都進(jìn)行更新,可以引入懶操作。懶操作包括區(qū)間更新和區(qū)間查詢操作。本文將通過一個示例和大家詳細(xì)聊聊線段樹中的懶操作,需要的可以參考一下

一、問題提出

對于線段樹,若要求對區(qū)間中的所有點(diǎn)都進(jìn)行更新,可以引入懶操作。

懶操作包括區(qū)間更新和區(qū)間查詢操作。

二、區(qū)間更新

對 [l,r] 區(qū)間進(jìn)行更新,例如將 [l,r] 區(qū)間所有元素都更新為 v,步驟如下。

1.若當(dāng)前節(jié)點(diǎn)區(qū)間被查詢區(qū)間[l,r]覆蓋,則僅對該節(jié)點(diǎn)進(jìn)行更新并做懶標(biāo)記,表示該節(jié)點(diǎn)已被更新,對該節(jié)點(diǎn)的子節(jié)點(diǎn)暫不更新。

2.判斷是在左子樹中查詢還是在右子樹中查詢。在查詢過程中,若當(dāng)前節(jié)點(diǎn)帶有懶標(biāo)記,則將懶標(biāo)記傳給子節(jié)點(diǎn)(將當(dāng)前節(jié)點(diǎn)的懶標(biāo)記清除,將子節(jié)點(diǎn)更新并做懶標(biāo)記),繼續(xù)查找。

3.在返回時更新最值。

三、區(qū)間查詢

帶有懶標(biāo)記的區(qū)間查詢和普通的區(qū)間查詢有所不同,在查詢過程中若遇到節(jié)點(diǎn)有懶標(biāo)記,則下傳懶標(biāo)記,繼續(xù)查詢。

四、實(shí)戰(zhàn)

1.問題描述

2.輸入

10
5 3 7 2 12 1 6 4 8 15
3 7 25
1 10

3.代碼

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]; // 樹結(jié)點(diǎn)存儲數(shù)組
 
    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; // 做懶標(biāo)記
    }
 
    // 向下傳遞懶標(biāo)記
    void pushdown(int k) {
        lazy(2 * k, tree[k].lz); // 傳遞給左孩子
        lazy(2 * k + 1, tree[k].lz); // 傳遞給右孩子
        tree[k].lz = -1; // 清除自己的懶標(biāo)記
    }
 
    // 創(chuàng)建線段樹,k表示存儲下標(biāo),區(qū)間[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; // 劃分點(diǎn)
        lc = k * 2; // 左孩子存儲下標(biāo)
        rc = k * 2 + 1; // 右孩子存儲下標(biāo)
        build(lc, l, mid);
        build(rc, mid + 1, r);
        tree[k].mx = Math.max(tree[lc].mx, tree[rc].mx); // 結(jié)點(diǎn)的最大值等于左右孩子最值的最大值
    }
 
    // 將區(qū)間 [l,r] 修改更新為 v
    void update(int k, int l, int r, int v) {
        // 找到該區(qū)間
        if (tree[k].l >= l && tree[k].r <= r) {
            lazy(k, v); // 更新并做懶標(biāo)記
            return;
        }
        if (tree[k].lz != -1)
            pushdown(k); // 懶標(biāo)記下移
        int mid, lc, rc;
        mid = (tree[k].l + tree[k].r) / 2; // 劃分點(diǎn)
        lc = k * 2; // 左孩子存儲下標(biāo)
        rc = k * 2 + 1; // 右孩子存儲下標(biāo)
        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); // 返回時修改更新最值
    }
 
    // 求區(qū)間 [l,r] 的最值
    int query(int k, int l, int r) {
        int Max = -inf;
        if (tree[k].l >= l && tree[k].r <= r) // 找到該區(qū)間
            return tree[k].mx;
        if (tree[k].lz != -1)
            pushdown(k); // 懶標(biāo)記下移
        int mid, lc, rc;
        mid = (tree[k].l + tree[k].r) / 2; // 劃分點(diǎn)
        lc = k * 2; // 左孩子存儲下標(biāo)
        rc = k * 2 + 1; // 右孩子存儲下標(biāo)
        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); // 創(chuàng)建線段樹
        // 輸入查詢最值的區(qū)間 [l,r] 1 10
        String[] range = line[2].split(" ");
        l = Integer.parseInt(range[0]);
        r = Integer.parseInt(range[1]);
        // 求區(qū)間[l..r]的最值
        output += query(1, l, r) + "\n";
        // 輸入更新的區(qū)間值 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]);
        // 將區(qū)間 [l,r] 修改更新為 v
        update(1, l, r, v);
        // 求區(qū)間[l..r]的最值 第 4 行:1 10
        range = line[4].split(" ");
        l = Integer.parseInt(range[0]);
        r = Integer.parseInt(range[1]);
        // 求區(qū)間 [l..r] 的最值
        output += query(1, l, r) + "\n";
        return output;
    }
}
 
// 結(jié)點(diǎn)
class node {
    int l; // l 表示區(qū)間左右端點(diǎn)
    int r; // r 表示區(qū)間左右端點(diǎn)
    int mx; // mx表示區(qū)間[l,r]的最值
    int lz; // lz 懶標(biāo)記
}

4.測試

以上就是Java數(shù)據(jù)結(jié)構(gòu)之線段樹中的懶操作詳解的詳細(xì)內(nèi)容,更多關(guān)于Java線段樹 懶操作的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot整合Druid數(shù)據(jù)庫連接池的方法

    SpringBoot整合Druid數(shù)據(jù)庫連接池的方法

    Druid是Java語言中最好的數(shù)據(jù)庫連接池。Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能。這篇文章主要介紹了SpringBoot整合Druid數(shù)據(jù)庫連接池的方法,需要的朋友可以參考下
    2020-07-07
  • SpringBoot項(xiàng)目實(shí)戰(zhàn)之?dāng)?shù)據(jù)交互篇

    SpringBoot項(xiàng)目實(shí)戰(zhàn)之?dāng)?shù)據(jù)交互篇

    這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目實(shí)戰(zhàn)之?dāng)?shù)據(jù)交互篇的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • pagehelper踩坑記之分頁亂套問題解決

    pagehelper踩坑記之分頁亂套問題解決

    這篇文章主要為大家介紹了pagehelper踩坑記之分頁亂套問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • java鏈表的常見簡單面試算法題詳解

    java鏈表的常見簡單面試算法題詳解

    文章總結(jié):本文主要介紹了單鏈表的基本操作,包括頭插法、尾插法、鏈表翻轉(zhuǎn)、鏈表成環(huán)判斷、成環(huán)位置判斷、成環(huán)長度判斷,以及有序鏈表的合并,通過實(shí)例和代碼示例,詳細(xì)講解了每種操作的原理和實(shí)現(xiàn)方法
    2025-01-01
  • Springboot中如何自動轉(zhuǎn)JSON輸出

    Springboot中如何自動轉(zhuǎn)JSON輸出

    這篇文章主要介紹了Springboot中如何自動轉(zhuǎn)JSON輸出,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • IntelliJ IDEA 設(shè)置數(shù)據(jù)庫連接全局共享的步驟

    IntelliJ IDEA 設(shè)置數(shù)據(jù)庫連接全局共享的步驟

    在日常的軟件開發(fā)工作中,我們經(jīng)常會遇到需要在多個項(xiàng)目之間共享同一個數(shù)據(jù)庫連接的情況,默認(rèn)情況下,IntelliJ IDEA 中的數(shù)據(jù)庫連接配置是針對每個項(xiàng)目單獨(dú)存儲的,幸運(yùn)的是,IntelliJ IDEA 提供了一種方法來將數(shù)據(jù)庫連接配置設(shè)置為全局共享,從而簡化這一過程
    2024-10-10
  • java向數(shù)據(jù)庫插入數(shù)據(jù)顯示亂碼的幾種問題解決

    java向數(shù)據(jù)庫插入數(shù)據(jù)顯示亂碼的幾種問題解決

    這篇文章主要給大家介紹了關(guān)于java向數(shù)據(jù)庫插入數(shù)據(jù)顯示亂碼問題的解決方案,文章分別羅列了前臺亂碼的問題、前臺先后臺插入數(shù)據(jù)后臺接收到的數(shù)據(jù)是亂碼以及后臺向數(shù)據(jù)庫插入數(shù)據(jù)是亂碼等幾種情況,需要的朋友可以參考下
    2021-11-11
  • SpringMVC后端Controller頁面跳轉(zhuǎn)的三種方式匯總

    SpringMVC后端Controller頁面跳轉(zhuǎn)的三種方式匯總

    這篇文章主要介紹了SpringMVC后端Controller頁面跳轉(zhuǎn)的三種方式匯總,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Java用Arrays.asList初始化ArrayList實(shí)例方法

    Java用Arrays.asList初始化ArrayList實(shí)例方法

    在本篇文章里小編給大家分享的是關(guān)于Java中使用Arrays.asList初始化ArrayList的知識點(diǎn)內(nèi)容,需要的朋友們參考下。
    2019-10-10
  • 如何通過idea實(shí)現(xiàn)springboot集成mybatis

    如何通過idea實(shí)現(xiàn)springboot集成mybatis

    這篇文章主要介紹了如何通過idea實(shí)現(xiàn)springboot集成mybatis,使用springboot 集成 mybatis后,通過http請求接口,使得通過http請求可以直接操作數(shù)據(jù)庫,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09

最新評論

津市市| 昌图县| 鄂托克前旗| 新宁县| 石家庄市| 丹巴县| 福州市| 册亨县| 弥渡县| 霞浦县| 洛宁县| 汶上县| 万源市| 邹城市| 曲麻莱县| 东乡县| 蒙城县| 贺州市| 东台市| 都兰县| 赞皇县| 德钦县| 蓬安县| 宁阳县| 海阳市| 大方县| 微山县| 共和县| 泗阳县| 镶黄旗| 正安县| 屯留县| 通许县| 呼玛县| 万全县| 朝阳区| 株洲县| 河南省| 茂名市| 林周县| 清新县|