LCT 實現區間加減區間求和

2022-06-06 20:09:11 字數 1006 閱讀 4853

用 lct 實現序列的區間加減,區間求和。

對於每乙個操作,只需要用一下 split 操作,把 u~v 的所有點弄到乙個 splay 裡面去即可

為了支援打標記,需要維護每個點的子樹大小

pushup 時,將某個點的子樹大小更新為其左右孩子子樹大小和 +1 即可

注意加法標記是需要下傳的

自己做的時候遇到的乙個小問題是:pushup 時更新 sum 需要用到單個節點的權值 val[p],這個東西怎麼單獨維護

後來發現這個東西也可以懶掉,即只有標記下傳到這個點的時候才更新它,或者更確切地說,我們額外記錄乙份 val,這份東西的更新狀態和 lct 中的區間和 a 保持一致就好了

#include using namespace std;

#define int long long

const int n = 1000000;

int n,m,val[n];

namespace lct

void add(int p,int v)

inline void pushdown(int x)

if(tag[x])

} inline bool isroot(int x)

inline void rotate(int p)

inline void splay(int x)

void access(int x)

void makeroot(int x)

int find(int x)

void split(int x,int y)

void cut(int x,int y)

void link(int x,int y)

int query(int x,int y)

}signed main()

for(int i=1;i>t1;

val[i]=t1;

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

else

}}

區間求和 I LintCode

給定乙個整數陣列 下標由 0 到 n 1,其中 n 表示陣列的規模 以及乙個查詢列表。每乙個查詢列表有兩個整數 start,end 對於每個查詢,計算出陣列中從下標 start 到 end 之間的數的總和,並返回在結果列表中。注意事項 在做此題前,建議先完成以下三題 線段樹的構造,線段樹的查詢,以及...

區間求和II

已知 在類的建構函式中給乙個整數陣列,實現兩個方法 query start,end 和 modify index,value 思路 這題非常奇怪,因為難度係數是最高的,但是類結構是完整的,上述兩個函式本身實現也是非常簡單的,我能想到唯一的點就是如何在多個函式之間共享資料,但似乎也算不上難點,而且之間...

區間求和 II

在類的建構函式中給乙個整數陣列,實現兩個方法query start,end 和modify index,value 樣例1 輸入 1,2,7,8,5 query 0,2 modify 0,4 query 0,1 modify 2,1 query 2,4 輸出 10,6,14 說明 給定陣列 a 1,...