首页 > 其他分享 >[ARC117D] Miracle Tree

[ARC117D] Miracle Tree

时间:2023-08-17 20:11:26浏览次数:35  
标签:ARC117D EndPoint dist int Tree Miracle fa cal operatorname

题目大意

给定一棵 \(n\) 个节点的树,要求构造出一个点权序列 \(E\),满足以下三个条件:

  1. 所有 \(E_i\ge 1(1\le i\le n)\)。
  2. 对于任意一组 \((i,j)(1 ≤ i < j ≤ N)\),使 \(|E_i-E_j|\geq \operatorname{dist}(i,j)\),\(\operatorname{dist}(i,j)\) 即树上 \(i\) 和 \(j\) 两点距离。
  3. 使 \(E\) 中的最大值最小。

思路

首先只考虑前两个限制,设有点 \(i,j,k\) 满足

\[E_i < E_j < E_k \]

因为有

\[E_k-E_i=E_k-E_j+E_j-E_i \]

由于

\[E_k-E_j\geq \operatorname{dist}(k,j),E_j-E_i\geq \operatorname{dist}(i,j) \]

所以有

\[E_k-E_i \geq \operatorname{dist}(k,j) + \operatorname{dist}(i,j) \]

又因为

\[\operatorname{dist}(k,j) + \operatorname{dist}(i,j) \geq \operatorname{dist}(i,k) \]

使得 \(E_k-E_j\) 尽可能小,得到

\[E_k-E_i=\operatorname{dist}(k,i) \]

那么我们直接可以用欧拉序列进行构造,欧拉序列的长度为 \(2n - 1\)。

再考虑第三个限制条件,让 \(E\) 中的最大值最小。

考虑我们欧拉序列有重复走的部分,我们使那个重复走的链的部分最短,那么那一段我们就可以选取树的直径。

那么我们怎么保证固定我们最后走哪个点呢?如果一条边在直径上,我们就最后经过这条边,这样在到达直径的第二个端点时,能够保证其他的点都已经遍历过。

Code

#include <bits/stdc++.h>

using namespace std;

const int N = 200500;

vector<int> e[N];

int n;

int dis[N];

int EndPoint,End;

void dfs1(int x,int fa) {
    dis[x] = dis[fa] + 1;

    if(dis[x] > dis[EndPoint])
        EndPoint = x;
    
    for(auto const &to : e[x]) {
        if(to == fa)
            continue;
        
        dfs1(to,x);
    }
}

void GetCal() {
    dfs1(1,0);

    End = EndPoint;

    dfs1(EndPoint,0);
}

bool cal[N];

void dfs2(int x,int fa) {
    if(x == End)
        cal[x] = 1;
    for(auto const &to : e[x]) {
        if(to == fa)
            continue;
        
        dfs2(to,x);
        cal[x] |= cal[to];
    }
}

int ans[N],tot;

void dfs3(int x,int fa) {
    tot ++;
    ans[x] = tot;

    for(auto const &to : e[x]) {
        if(to == fa || cal[to])
            continue;
        
        dfs3(to,x);
        tot ++;
    }

    for(auto const &to : e[x]) {
        if(to == fa || !cal[to])
            continue;
        
        dfs3(to,x);
    }
}

int main() {
    cin >> n;

    for(int i = 1,u,v;i < n; i++) {
        cin >> u >> v;
        e[u].emplace_back(v);
        e[v].emplace_back(u);
    }

    GetCal();
    
    dfs2(EndPoint,0);
    dfs3(EndPoint,0);

    for(int i = 1;i <= n; i++) 
        cout << ans[i] << " ";
    
    cout << "\n";
    return 0;
}

标签:ARC117D,EndPoint,dist,int,Tree,Miracle,fa,cal,operatorname
From: https://www.cnblogs.com/baijian0212/p/ARC117D.html

相关文章

  • 杭电23多校第九场Capoo on tree(二分+树链剖分+可持久化线段树)
    2023HDU多校9__Capooontree(二分+树链剖分+可持久化线段树)题目链接Solution\(Hint1\)考虑如何进行对某一相同点权的所有点进行点权\(+1\)操作,如果我们建立权值线段树,那只需要将权值为\(x\)的点并入权值\(x+1\)即可,但是这样就算我们建立以节点编号为版本的可持久化线段树,也是......
  • D. Trees and Segments
    D.TreesandSegmentsTheteachersoftheSummerInformaticsSchooldecidedtoplant$n$treesinarow,anditwasdecidedtoplantonlyoaksandfirs.Todothis,theymadeaplan,whichcanberepresentedasabinarystring$s$oflength$n$.If$s_i=......
  • CF1844G Tree Weights
    题面传送门这个真的很容易想到吗?首先定\(1\)为根,设每个点的深度是\(d_i\),则两个点之间的距离是\(d_{i}+d_{i+1}-2d_{LCA(i,i+1)}\)。题目中相当于给出了\(n-1\)个方程和\(n-1\)个限制,要解出一个\(n-1\)元的方程。因为限制是从\(1\ton-1\)给出的,所以不可能包含,因此......
  • vue-treeselect 校验失败添加红框
    需求vue-treeselect校验及清除校验这篇介绍了用@input在校验失败时显示校验信息。但还需要同时显示红色边框。如下图所示:解决办法思路:动态绑定类名,校验失败时切换类名,更改边框颜色。子组件SelectTree二次封装vue-treeselect:组件SelectTree<template><divclass=......
  • 二叉搜索树(BST,binary search tree)
    对于静态查找可以用二分查找,将查找时间复杂度降到log2n。其中,虽然数据存储在线性的结构里,但我们事先对数据进行了处理,在查找的顺序过程中运用到判定树这样的结构,将线性上的查找过程转变为了在类似树上面的查找过程,其查找的效率就是树的高度。但如果查找的集合不仅有查找还......
  • Tree Distances I
    TreeDistancesI思路先考虑只算节点\(1\)的答案,我们发现如果要每个节点都这么算一次的话,绝对会我们发现,这种算法的瓶颈在于必须要每个节点都算一遍,而每算一遍都需要\(O(n)\),所以才会超时,那么可以思考如何快速的求出答案(总共\(O(1)\)是不肯能的,别妄想了),对于相连的两个点,似......
  • WPF 由TreeView想到的 DataTemplate,HierarchicalDataTemplate
    DataTemplate简而言之,解决的就是后台代码中的类以怎么样的形式展现在xaml前台代码中的问题。所以DataTemplate一般都要指定DataType,一般放在resource中,而HierarchicalDataTemplate是一种特殊的DataTemplate,它指定一个ItemsSource,当自身属性是列表时,有次序的在前台展示下去。以......
  • LeetCode 7022——熟悉TreeSet数据结构及常用方法的使用
    LeetCode7022.限制条件下元素之间的最小绝对差题目描述:给你一个下标从 0 开始的整数数组 nums 和一个整数 x 。请你找到数组中下标距离至少为 x 的两个元素的 差值绝对值 的 最小值 。换言之,请你找到两个下标 i 和 j ,满足 abs(i-j)>=x 且 abs(nums[i......
  • Binary Tree Preorder Traversal
    SourceGivenabinarytree,returnthepreordertraversalofitsnodes'values.NoteGivenbinarytree{1,#,2,3},1\2/3return[1,2,3].ExampleChallengeCanyoudoitwithoutrecursion?题解1-递归递归版很好理解,首先判断当前节点......
  • Subtree 题解
    Subtree题目大意给定一颗树,你可以选出一些节点,你需要对于每个点求出在强制选这个点的情况下所有选择的点联通的方案数,对给定模数取模。思路分析对于这种求树上每一个点方案数的题目,首先考虑换根DP。强制嵌定树根为\(1\),设\(f_i\)表示在\(i\)的子树中选点,\(i\)强制选,所......