zoukankan      html  css  js  c++  java
  • [HEOI2016/TJOI2016]树

    Description

    [HEOI2016/TJOI2016]树

    Solution

    树剖裸题,以为会爆栈(然而却是爆栈了,但是不知道怎么改)
    剖成链之后,每段链的线段树维护区间最大值(因为DFS序大的肯定离点近)

    Code

    #pragma GCC optimize(2)
    #pragma GCC optimize(3)
    #pragma GCC optimize("Ofast")
    #pragma GCC optimize("inline")
    #pragma GCC optimize("-fgcse")
    #pragma GCC optimize("-fgcse-lm")
    #pragma GCC optimize("-fipa-sra")
    #pragma GCC optimize("-ftree-pre")
    #pragma GCC optimize("-ftree-vrp")
    #pragma GCC optimize("-fpeephole2")
    #pragma GCC optimize("-ffast-math")
    #pragma GCC optimize("-fsched-spec")
    #pragma GCC optimize("unroll-loops")
    #pragma GCC optimize("-falign-jumps")
    #pragma GCC optimize("-falign-loops")
    #pragma GCC optimize("-falign-labels")
    #pragma GCC optimize("-fdevirtualize")
    #pragma GCC optimize("-fcaller-saves")
    #pragma GCC optimize("-fcrossjumping")
    #pragma GCC optimize("-fthread-jumps")
    #pragma GCC optimize("-funroll-loops")
    #pragma GCC optimize("-fwhole-program")
    #pragma GCC optimize("-freorder-blocks")
    #pragma GCC optimize("-fschedule-insns")
    #pragma GCC optimize("inline-functions")
    #pragma GCC optimize("-ftree-tail-merge")
    #pragma GCC optimize("-fschedule-insns2")
    #pragma GCC optimize("-fstrict-aliasing")
    #pragma GCC optimize("-fstrict-overflow")
    #pragma GCC optimize("-falign-functions")
    #pragma GCC optimize("-fcse-skip-blocks")
    #pragma GCC optimize("-fcse-follow-jumps")
    #pragma GCC optimize("-fsched-interblock")
    #pragma GCC optimize("-fpartial-inlining")
    #pragma GCC optimize("no-stack-protector")
    #pragma GCC optimize("-freorder-functions")
    #pragma GCC optimize("-findirect-inlining")
    #pragma GCC optimize("-fhoist-adjacent-loads")
    #pragma GCC optimize("-frerun-cse-after-loop")
    #pragma GCC optimize("inline-small-functions")
    #pragma GCC optimize("-finline-small-functions")
    #pragma GCC optimize("-ftree-switch-conversion")
    #pragma GCC optimize("-foptimize-sibling-calls")
    #pragma GCC optimize("-fexpensive-optimizations")
    #pragma GCC optimize("-funsafe-loop-optimizations")
    #pragma GCC optimize("inline-functions-called-once")
    #pragma GCC optimize("-fdelete-null-pointer-checks")
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define MAXN 800010
    struct rec {
    	int nxt, ver;
    } t[MAXN];
    struct Rec {
    	int val;
    } tree[MAXN];
    int n, q, cnt, u, v, x, s;
    int head[MAXN], Top[MAXN], Fa[MAXN], h[MAXN], H[MAXN];
    char ch;
    bool vis[MAXN];
    inline int read() {
    	int s = 0, w = 1;
    	char c = getchar();
    	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
    	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
    	return s * w;
    }
    inline void add(int u, int v) {
    	t[++cnt].nxt = head[u], t[cnt].ver = v, head[u] = cnt;
    }
    void DFS(int u, int fa) {
    	vis[u] = true, Top[u] = fa, h[u] = ++s, H[s] = u;
    	for (register int i = head[u]; i; i = t[i].nxt) {
    		int v = t[i].ver;
    		if (!vis[v])
    			Fa[v] = u, DFS(v, fa);
    		break;
    	}
    	for (register int i = head[u]; i; i = t[i].nxt) {
    		int v = t[i].ver;
    		if (!vis[v])
    			Fa[v] = u, DFS(v, v);
    	}
    }
    inline void update(int now) {
    	tree[now].val = max(tree[now << 1].val, tree[now << 1 | 1].val);
    }
    void Modify(int now, int l, int r, int k) {
    	#define mid ((l + r) >> 1)
    	if (l == r) {
    		tree[now].val = max(tree[now].val, k);
    		return;
    	}
    	if (k <= mid) Modify(now << 1, l, mid, k);
    	else Modify(now << 1 | 1, mid + 1, r, k);
    	update(now);
    	#undef mid
    }
    int Query(int now, int l, int r, int x, int y) {
    	int ans = 0;
    	#define mid ((l + r) >> 1)
    	if (x <= l && r <= y)
    		return max(ans, tree[now].val);
    	if (x <= mid) ans = max(ans, Query(now << 1, l, mid, x, y));
    	if (mid < y) ans = max(ans, Query(now << 1 | 1, mid + 1, r, x, y));
    	return ans;
    	#undef mid
    }
    int fuck(int now) {
    	while (now) {
    		s = Query(1, 1, n, h[Top[now]], h[now]);
    		if (s) return H[s];
    		now = Fa[Top[now]];
    	}
    }
    int main() {
    	freopen("pa.in", "r", stdin);
    	freopen("pa.out", "w", stdout);
    	n = read(), q = read();
    	for (register int i = 1; i <= n - 1; i++)
    		u = read(), v = read(), add(u, v), add(v, u);
    	DFS(1, 1);
    	Modify(1, 1, n, 1);
    	while (q--) {
    		ch = getchar();
    		if (ch == 'Q') {
    			x = read();
    			printf("%d
    ", fuck(x));
    		}
    		if (ch == 'C') {
    			x = read();
    			Modify(1, 1, n, h[x]);
    		}
    	}
    	return 0;
    }
    
    只要有想见的人,就不是孤身一人了。
  • 相关阅读:
    Jzoj4822 完美标号
    Jzoj4822 完美标号
    Jzoj4792 整除
    Jzoj4792 整除
    Educational Codeforces Round 79 A. New Year Garland
    Good Bye 2019 C. Make Good
    ?Good Bye 2019 B. Interesting Subarray
    Good Bye 2019 A. Card Game
    力扣算法题—088扰乱字符串【二叉树】
    力扣算法题—086分隔链表
  • 原文地址:https://www.cnblogs.com/Agakiss/p/11624353.html
Copyright © 2011-2022 走看看