模板 動態開點線段樹 CF915E

2022-09-20 12:30:13 字數 1134 閱讀 4448

支援區間覆蓋的動態開點線段樹的模板

一開始在結構體記錄區間的左右端點,但空間卡得太緊沒過,去掉以後又改了一下結構體大小才過。

這是剛開始的**

#includeusing namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*w;

}const int n=1e7;

int n,m;

struct nodet[n];

int rt,tot;

int build(int l,int r)

void pushup(int x)

void pushdown(int x)

else

}}void change(int x,int l,int r,int c)

int mid=t[x].l+t[x].r>>1;

pushdown(x);

if(l<=mid)

if(r>mid)

pushup(x);

}int main()

return 0;

}

改後的**

#includeusing namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*w;

}const int n=1e7+5e6;

int n,m;

struct nodet[n];

int rt,tot;

int build()

void pushup(int x)

void pushdown(int x,int l,int r)

else

}}void change(int x,int l,int r,int c,int l,int r)

int mid=l+r>>1;

pushdown(x,l,r);

if(l<=mid)

if(r>mid)

pushup(x);

}int main()

return 0;

}

動態開點線段樹

前置芝士 眾所周知,普通線段樹空間複雜度是 o n 4 所以當n很大的時候,如果正常的去建一顆線段樹,開4倍n空間顯然會炸記憶體 怎麼辦呢?這個時候,動態開點線段樹出現了。概念 動態開點線段樹是一類特殊的線段樹,與普通的線段樹不同的是,每乙個節點的左右兒子不是該點編號的兩倍和兩倍加一,而是現加出來的...

學習筆記 動態開點線段樹

通過只開需要使用的結點以節省空間。實現過程就是把點乙個乙個往樹裡面插。建樹時遞迴進入當前結點的子結點後,若該結點為 0 即不存在,就開點。所謂開點即為把當前結點的編號設定為 tot 這樣處理下來,每個結點的編號顯然是亂序的。可以 l son 和 r son 分別記錄左右子結點的編號,然後讓它們代替普...

動態開點線段樹 學習筆記

所謂權值線段樹,就是指線段樹記憶體的是權值。好像是廢話。給出一些數,要查詢乙個區間內的數的個數。這時可以用權值線段樹,開個n n為給出的數的最大值 個點的線段樹。然後就能輕鬆的維護了當然樹狀陣列更簡單 為什麼要動態開點呢?當然是因為空間不夠啊。比如還是上面那個例子。加入給出的數的最大值為 10 並且...