ACM 線段樹 專題

2021-09-17 23:54:20 字數 1908 閱讀 9885

其中應該有我以前 刷過的題吧   沒有辦法   演算法這東西 一不刷  就會忘。。。。 像這道題 我 就wa了  四發 才過  

但是 我 以前確實過過。。。

再重新理解一下吧   大概就是 線段樹  就是 左右 節點   然後 上面就是 我們的 和   建立的時候和每次修改 都要更新一下父節點 也就是子節點的和  

樹這個東西  仔細想想   確實集合了 鍊錶和陣列的優點

鍊錶 的優點就是可以 增刪改   而 陣列就是 查詢 還有排序比較 簡便   但是當你需要 大量的 查詢 增刪改的時候

確實需要樹這個東西  什麼 紅黑 01  線段 字典  就開始 往上甩了

某平  說的   寫到我的小本本上面

#include#include#include#include#includeusing namespace std;

int s[50500<<2];

char str[25];

int l,ll;

void upset(int index)

int sun=0;

void build(int l,int r,int index)

int mid=(l+r)>>1;

build(l,mid,index<<1);

build(mid+1,r,index<<1|1);

upset(index);

}int query(int l,int r,int ll,int rr,int index)

int mid=(rr+ll)/2;

int ans=0;

if(l<=mid)

if(r>mid)

return ans;

}void update(int l,int c,int ll,int rr,int index)

int mid=(ll+rr)/2;

if(l>mid)

else

upset(index);

}void go(int n)

scanf("%d%d",&l,&ll);

if(str[0]=='a')

else if(str[0]=='s')

else if(str[0]=='q')

}}int main()

return 0;

}

這個題 和上面的一樣 只不過加 變成了 找出最大值而已 

#include#include#include#include#includeusing namespace std;

int s[200000<<4];

void upset(int index)

void build(int l,int r,int index)

int mid=(l+r)/2;

build(l,mid,index<<1);

build(mid+1,r,index<<1|1);

upset(index);

}int query(int l,int r,int ll,int rr,int index)

int mid=(ll+rr)/2;

int ans=0;

if(r>mid)

if(l<=mid)

return ans;

}void update(int l,int c,int ll,int rr,int index)

int mid=(ll+rr)/2;

if(l>mid)

else

upset(index);

}int main()

else}}

return 0;

}

線段樹專題

最最基礎的線段樹,只更新葉子節點,然後把資訊用pushup int r 這個函式更新上來。hdu1166 敵兵布陣 線段樹 hdu 1166 敵兵布陣 單點更新區間求和 hdu1754 i hate it 線段樹 hdu 1754 i hate it 單點更新 區間求最值 hdu1394 minim...

線段樹專題

題意 給定n個數 a1,a2,a na 1,a 2,dots,a n a1 a2 an 給出q個詢問求 l,r 內所有子區間的異或和。比如,陣列1,2,3中 1,3 的異或和為 1 1 xor2 1xo r2xo r3 2 2xo r3 3 1 1xor2 1xor2xor3 2 2xor3 3 1...

線段樹專題

敵兵布陣 單點更新,區間求和查詢 include include include include include using namespace std const int maxn 5e4 5 struct nodet maxn 4 int a maxn nsum void build int x...