打上标记(给树)
这题没啥可说的,就是线段树题,
#include<cstring> #include<vector> #include<iostream> #include<algorithm> #include<cstdio> using namespace std; typedef long long ll; const int maxn = 1e5 + 100; #define lson node*2 #define rson node*2 + 1 int id[maxn], f[maxn], dep[maxn]; int top[maxn], son[maxn], siz[maxn]; int head[maxn]; struct Node { int to; int next; }G[maxn * 2]; int z = 0; void add(int be, int en) { G[++z].to = en; G[z].next = head[be]; head[be] = z; } ll tree[maxn * 4]; int push(int node, int be, int en) { int mid = be + en >> 1; if (tree[node]) { if (!tree[lson]) tree[lson] = tree[node]; else { if (dep[tree[lson]] < dep[tree[node]]) {// tree[lson] = tree[node]; } } if (!tree[rson]) tree[rson] = tree[node]; else { if (dep[tree[rson]] < dep[tree[node]]) {// tree[rson] = tree[node]; } } tree[node] = 0; } return 0; } int update(int node, int be, int en, int LL, int RR, int val) { int mid = be + en >> 1; if (LL <= be && en <= RR) { if (tree[node] == 0 || dep[tree[node]] < dep[val]) { tree[node] = val; } return 0; } push(node, be, en); if (LL <= mid) update(lson, be, mid, LL, RR, val); if (RR > mid) update(rson, mid + 1, en, LL, RR, val); } int cn = 0; int ask(int node, int be, int en, int i) { int mid = be + en >> 1; if (be == en) { printf("%lld\n", tree[node]); return 0; } push(node, be, en); if (i <= mid) ask(lson, be, mid, i); else ask(rson, mid + 1, en, i); } int dfs(int x, int fa, int d) { f[x] = fa; siz[x] = 1; int s = 0; dep[x] = d; for (int i = head[x]; i; i = G[i].next) { int p = G[i].to; if (p == fa) continue; dfs(p, x, d + 1); siz[x] += siz[p]; if (s > siz[p]) { son[x] = p; s = siz[p]; } } return 0; } int cnn = 0; int dfs2(int x, int tp) { id[x] = ++cn; top[x] = tp; if (son[x]) dfs2(son[x], tp); for (int i = head[x]; i; i = G[i].next) { int p = G[i].to; if (p == f[x] || p == son[x]) continue; dfs2(p, p); } return 0; } int main() { int n; int m; scanf("%d %d", &n, &m); int be, en; for (int i = 1; i < n; i++) { scanf("%d%d", &be, &en); add(be, en); add(en, be); } dfs(1, -1, 1); dfs2(1, 1); dep[0] = 0; update(1, 1, n, id[1], id[1] + siz[1] - 1, 1); while (m--) { int x; char op[20]; scanf("%s", op); scanf("%d", &x); if (op[0] == 'Q') {//询问 ask(1, 1, n, id[x]); } else {//标记 update(1, 1, n, id[x], id[x] + siz[x] - 1, x); } } return 0; }
寻找真正的热爱