線段樹二(區間修改)

2022-04-30 08:45:13 字數 1170 閱讀 8843

概述

區間修改即將乙個區間內所有值改為乙個值(或加上乙個值),為了執行快速,我們通常用「懶」標記維護整個區間值的情況,在需要是再將這個「懶」標記傳到該節點的兩個子節點上。

模版(此為在整個區間上加上乙個值)(洛谷p3372)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const long long inf=2e18+7;

long long d[1000000],n,color[1000000];

//查詢

long long visit(long long le,long long ri,long long k,long long x,long long y)

long long mid=(le+ri)>>1,ans=0;

if(color[k])

if(mid>=x)ans+=visit(le,mid,k*2,x,y);

if(mid

d[k]=d[k*2]+d[k*2+1];

return ans;

}//更改

void go(long long le,long long ri,long long k,long long x,long long y,long long wh)

long long mid=(le+ri)>>1;

if(color[wh])

if(mid>=x)

go(le,mid,k,x,y,wh*2);

if(mid

go(mid+1,ri,k,x,y,wh*2+1);

d[wh]=d[wh*2]+d[wh*2+1];

}int main()

for(i=1;i<=m;i++)

else

}return 0;

}注意:在查詢和更改時都要下穿「懶」標記

線段樹(二) 區間修改

上一節介紹了點修改與區間查詢的線段樹,事實上,線段樹還可以做得更多。本節討論區間修改問題。給出乙個 n 個元素的陣列 a 1,a 2,a n 你的任務是設計乙個資料結構,支援以下兩種操作 點修改只會影響到 logn 個結點,但區間修改在最壞情況下會影響到樹中的所有結點,比如,如果對整個區間執行 ad...

線段樹 二 區間乘 區間加

放 注意點 注意運算子優先順序 比如 a b p 是b先mod p再與a相乘 a 1 1是1 1再a位移 a 1 a 2 a 1 1 a 2 1 參見 線段樹v2.0 支援區間加 區間乘 區間和查詢 include include include define n 1000010 using nam...

線段樹(2)區間修改

快速序列操作i,給出乙個n個元素的陣列a1,a2,an,你的任務是設計乙個資料結構支援一下兩種操作 set l,r,v 把al,al 1,ar的值全部修改為v v 0 query l,r 計算子串行al,al 1,ar的元素和 最小值和最大值。include include using namesp...