概述
區間修改即將乙個區間內所有值改為乙個值(或加上乙個值),為了執行快速,我們通常用「懶」標記維護整個區間值的情況,在需要是再將這個「懶」標記傳到該節點的兩個子節點上。
模版(此為在整個區間上加上乙個值)(洛谷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...