或者說葉節點 所代表的區間是1呀。
想象成初中歷史書上的周朝等級制度圖就吼了呀!
只不過是一顆樹而已。
或者這麼看更吼?
反正就是一顆樹辣!不是一顆賽艇!
我承認走神了(義正言辭)。
真正的線段樹是這樣的。。。
大概就是這樣!
然後上強勢板子!
#include
#include
#include
#include
#define ls (x << 1)
#define rs (x << 1 | 1)
#define mid int mid=(l+r)>>1
using
namespace
std;
int a[101000],t[400100],n,m,l,r,place,add,ans;
inline
int gi()
while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
return x*si;
}inline
void build(int x,int l,int r)
else t[x]=a[l];
return;
}inline
void updata(int x,int l,int r,int k,int addnum)
else t[x]+=addnum;
return;
}inline
int query(int x,int l,int r,int xl,int xr)
else
return t[x];
}int main()
else}}
然後是區間修改+看你看不看得出來的查詢!
你問我lazy和down是什麼意思?因為很懶!懶得改!
#include
#include
#include
#include
#define n 500010
#define ls x << 1
#define rs x << 1 | 1
using namespace std;
intsum[n], lazy[n], n, q, i, size[n], a[n];
int gi()
void down(int x)
void build(int x, int l, int r)
int mid = (l + r) >> 1;
build(ls, l, mid), build(rs, mid + 1, r);
sum[x] = sum[ls] + sum[rs];
} void updata(int x, int l, int r, int xl, int xr, int v)
int mid =(l + r) >> 1;
if (xr <= mid) updata(ls, l, mid, xl, xr, v);
else
if (xl > mid) updata(rs, mid + 1, r, xl, xr, v);
else updata(ls, l, mid, xl, mid, v), updata(rs, mid + 1, r, mid + 1, xr, v);
sum[x] = sum[ls] + sum[rs];
}int query(int x, int l, int r, int xl, int xr)
int main()
}
然後還有什麼不懂得朋友可以
嘿嘿嘿。
這個時候是不是應該
日常安利一波
小題目?
codevs 1080 絕對不是什麼裸題
codevs 1082 也不是什麼裸題
然後大家可能會發現好難呀
給大家一道裸題吧!
codevs 1954 ( 題目名字就叫線段樹 )
主席樹板子(可持久化線段樹)
主席樹寫的比較好的部落格 題目描述 靜態區間l,r的最小值。方法 離散化輸入陣列,以離散化之後的陣列建立多顆線段樹。因為資料為離散化之後的滿足單調,直接查詢就可。問題一 何為離散化?其實我也不知道 把靜態區間排序,去重之後剩餘的即為離散化之後的陣列。此操作建議使用c 中stl。sort b 1,b ...
斜率優化的各種板子
維護由若干點 x,y 構成上凸包,並支援求給定乙個斜率k的求通過某個點截距的最大值,需保證 x 遞增,詢問 k 遞減是用query,否則用query2,單次log n 判斷需要用到叉積,注意是否會爆掉ll。namespace ch point operator const point rhs con...
0817 線段樹板子 洛谷P3373
傳送門 此題涉及區間修改,稍微需要注意一點的地方就是它又有區間乘,又有區間加。所以我們在處理到區間乘的時候要順帶把lazy add標記也乘以相應的值 程式裡是lazya 注意 用來記錄乘的懶標記初值應該為1 include include include include include includ...