• 打上标记(给树)


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

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

      

    寻找真正的热爱
  • 相关阅读:
    pikachu--XSS绕过
    pikachu--XSS盲打
    pikachu--XSS(案例三:获取键盘记录)
    pikachu--XSS(案例二:钓鱼攻击)
    pikachu--XSS(案例一:cookie的窃取和利用)
    pikachu--Burt Force(暴力破解)
    pikachu--XSS(跨站脚本)(反射型,存储型,DOM型)
    XSS(跨站脚本)概述
    DVWA--XSS(Reflected)、XSS(Stored)
    DVWA--CSRF(跨站请求伪造)
  • 原文地址:https://www.cnblogs.com/lesning/p/12466456.html
Copyright © 2020-2023  润新知