其中應該有我以前 刷過的題吧 沒有辦法 演算法這東西 一不刷 就會忘。。。。 像這道題 我 就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...