3306 樹 線段樹

2022-09-02 19:15:11 字數 1474 閱讀 6508

3306: 樹

首先dfs整顆樹將樹轉換線性結構,前兩個操作比較簡單,然後主要是對於操作三,有三種情況:

1.x=rt,那麼我們直接求出整顆樹中的最小值就是答案;

2.x在原樹中為rt的祖先節點,那麼我們首先求出從x到rt路徑上的x的第乙個節點y,那麼答案就是除了以y為根的子樹的其他所有節點的最小值;

3.對於除了以上兩種情況,直接求出以x為根的子樹的最小值即為答案.

2.**

#include using namespace std;

const int n = 2e5+5;

#define ls rt<<1

#define rs rt<<1|1

struct edge;

edge e[n];

int head[n];

int dep[n];

int tot;

void addedge(int u, int v) ;

head[u] = tot;

}int a[n], b[n];

int l[n], r[n];

int dfs_clock;

int f[n][20];

void dfs(int u)

r[u] = dfs_clock;

}int v[n<<2];

inline void pushup(int rt)

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

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

build(ls, l, mid);

build(rs, mid+1, r);

pushup(rt);

}void update(int rt, int l, int r, int a, int b)

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

if(a <= mid)

else

pushup(rt);

}int query(int rt, int l, int r, int a, int b)

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

int res = int_max;

if(a <= mid)

if(b > mid)

return res;

}void initlca(int n)

}}int go(int x, int d)

*/else if(l[x] < l[rt] && r[x] >= r[rt])

else

}else if(op[0] == 'v')

else

}return 0;

}

2018 08 18 線段樹(線段樹)

線段樹 描述請你維護乙個線段樹 支援一下操作 a x l r 區間 and x o x l r區間 or x x x l r 區間 xor x s l r 區間求和 輸入乙個數 t表示資料組數 乙個數n表示初始序列長 m表示查詢 隨後n個整數 接下來m次詢問 如上 輸出所以s次詢問的答案 樣例輸入 ...

初識線段樹(線段樹總結)

線段樹的最基本的操作 1 建樹 void construct int left,int right 上述 利用二分的方法,建立一棵葉子節點為 i,i 1 的線段樹 特點是每棵樹的根,一定包含於子樹的線段。2 插入一段線段 void insert int index,int c,int d 解釋 當要...

線段樹 線段樹練習五

description 一行n個方格,開始每個格仔裡的數都是0。現在動態地提出一些問題和修改 提問的形式是求某乙個特定的子區間 a,b 中所有元素的和 修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1 n 100000,提問和修改的總數可能達到100...