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...