zoukankan      html  css  js  c++  java
  • JZOJ6096 森林

    题目传送门

    Description

    ​我们定义对一棵树做一次变换的含义为:当以 1 号节点为根时,交换两个互相不为祖先的点的子树;
    ​一棵树的权值为对它进行至多一次变换能得到的最大直径长度;
    ​初始时你只有一个节点 1,你需要执行 n-1 个操作,第 i 次操作会给出一个整数 x,表示新加入第 i+1 号点,并与第 x 号点连一条边。每次操作后输出当前的树的权值。
    ​强制在线。

    Solution

    ​我们可以发现,答案需要维护的是一个下图这样的东西中三条链长和最长的,然后答案就是链长和-1。

    ​这个东西中显然有一条是直径,另一个点是树上距离直径最远的点。我们需要维护这三个点,每次加入一个点先尝试修改直径端点,再尝试修改另一个点,计算树上距离用倍增或树剖即可。
    好像可以用LCT做,但是我不会。
    细节见代码

    #include<bits/stdc++.h>
    #define rep(i, a, b) for (register int i=(a); i<=(b); ++i)
    #define per(i, a, b) for (register int i=(a); i>=(b); --i)
    using namespace std;
    const int N=200005;
    int dep[N], fa[N][22], ans, x=1, y=1, z=1;
    
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
        for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
        return x*f;
    }
    
    int LCA(int u, int v)
    {
    	if (dep[u]<dep[v]) swap(u, v);
    	per(i, 20, 0) if (dep[fa[u][i]]>=dep[v]) u=fa[u][i];
    	if (u==v) return u;
    	per(i, 20, 0) if (fa[u][i]^fa[v][i]) u=fa[u][i], v=fa[v][i];
    	return fa[u][0];
    }
    int dis(int u, int v){return dep[u]+dep[v]-2*dep[LCA(u, v)];}//点与点距离
    int dis2(int u, int v, int w)//点与直径距离
    {
    	int p=LCA(u, v);
    	if (LCA(p, w)^p) return dis(p, w);
    		else return min(dis(LCA(u, w), w), dis(LCA(v, w), w));
    }
    
    void solve(int u, int f)
    {
    	fa[u][0]=f; dep[u]=dep[f]+1;
    	rep(i, 1, 20) fa[u][i]=fa[fa[u][i-1]][i-1];
    	if (dis(x, u)<dis(y, u)) swap(x, y);
    	if (dis(x, u)>dis(x, y)) swap(u, y);
    	if (dis2(x, y, z)<dis2(x, y, u)) swap(u, z);
    	printf("%d
    ", ans=dis(x, y)+max(0, dis2(x, y, z)-1));
    }
    
    int main()
    {
    	freopen("forest.in", "r", stdin);
    	freopen("forest.out", "w", stdout);
    	read(); int n=read(); dep[1]=1;
    	rep(i, 2, n) solve(i, ans^read());
    	return 0;
    }
    
  • 相关阅读:
    MVC ORM 架构
    Kubernetes 第八章 Pod 控制器
    Kubernetes 第七章 Configure Liveness and Readiness Probes
    Kubernetes 第六章 pod 资源对象
    Kubernetes 第五章 YAML
    Kubernetes 核心组件
    Kubernetes 架构原理
    Kubernetes 第四章 kubectl
    Kubernetes 第三章 kubeadm
    yum 配置及yum 源配置
  • 原文地址:https://www.cnblogs.com/ACMSN/p/10645833.html
Copyright © 2011-2022 走看看