打上标记(给树)

这题没啥可说的,就是线段树题,

#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
", 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;
}

  

寻找真正的热爱
原文地址:https://www.cnblogs.com/lesning/p/12466456.html