dfs 線段樹 zhrt的資料結構課

2022-05-03 12:57:15 字數 1243 閱讀 7323

zhrt的資料結構課

這個題目我覺得是乙個有一點點思維的dfs+線段樹

雖然說看起來可以用樹鏈剖分寫,但是這個題目時間卡了樹剖

因為之前用樹剖一直在寫這個,所以一直想的是區間更新,想dfs+線段樹,有點點沒想明白

後來才知道可以把這個區間更新轉化成單點更新,就是查乙個結點的子樹,如果子樹有可以到根節點的,那麼這個結點肯定也可以到根節點。

#include #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f

#define inf64 0x3f3f3f3f3f3f3f3f

using namespace std;

const int maxn = 4e5 + 10;

int sum[maxn * 4];

void push_up(int id)

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

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

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

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

push_up(id);

}void update(int id,int l,int r,int pos,int val)

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

if (pos <= mid) update(id << 1, l, mid, pos, val);

else update(id << 1 | 1, mid + 1, r, pos, val);

push_up(id);

}int query(int id,int l,int r,int x,int y)

int el[maxn], er[maxn], tot = 0, head[maxn], cnt;

struct node

}ex[maxn];

void init()

void add(int u,int v)

void dfs(int u,int pre)

er[u] = tot;

// printf("el[%d]=%d er[%d]=%d\n", u, el[u], u, er[u]);

}int main()

dfs(1, -1);

while(m--)

}}}

資料結構 線段樹

啦啦啦啦啦啦線段樹是個好東西 好吧並沒有什麼好的 但貌似還是很好啊 線段樹就是一棵樹!顧名思義 又是這個詞 就是求關於一段的某些什麼什麼東西。比如區間最大值啊什麼的。引用百科知識 線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中...

資料結構 線段樹

一 目標 1.如何快速的查詢出下列陣列arr 2,5 的和 2。以及更新arr 4 為6。用普通的方法查詢的複雜度為o n 更新的複雜度為o 1 這時候我們可以用線段樹來快速完成這些操作,複雜度為logn。二 內容 如何建立,查詢,更新線段樹。public class qurqpd int tree...

資料結構 線段樹

線段樹是一顆平衡的二叉搜尋樹,他以空間換區時間,讓線性查詢加速log級別的查詢,用到的演算法主要是二分搜尋和遞迴。例如 有陣列data 我有乙個需求,我需要頻繁的查詢區間i j的sum和。這裡先給出兩個解決方案 如果使用最普通的演算法遍歷,那麼查詢和更新的複雜度為o n 當然你還可以使用動態規劃,定...