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;
    }
    
    只要有想见的人,就不是孤身一人了。
  • 相关阅读:
    活动安排问题
    喵哈哈村的魔法考试 Round #5 (Div.2) C
    梯度下降,牛顿法 ,高斯牛顿法
    SSD模型解析
    训练较深的卷积神经网络时遇到的问题
    手写体识别
    Fast Patch-based Style Transfer of Arbitrary Style 理解
    多任务学习
    迁移学习(训练数据少的可怜时的办法)
    通过训练得出的结果修改模型
  • 原文地址:https://www.cnblogs.com/Agakiss/p/11624353.html
Copyright © 2011-2022 走看看