Atcoder 题面传送门

笑死,阴间语文作业到现在还没写完,为了在这个点保持精神,我只好来颓篇题解辣

我们考虑探究一下怎么最小化 \(\max\limits_{i=1}^nE_i\),我们假设 \(E_{p_1}<E_{p_2}<E_{p_3}<\cdots<E_{p_n}\),那么对于 \(i\in[1,n-1]\),根据题目条件显然有 \(\text{dist}(p_i,p_{i+1})\le E_{p_{i+1}}-E_{p_i}\),累加起来则有 \(\sum\limits_{i=1}^{n-1}\text{dist}(p_i,p_{i+1})\le \sum\limits_{i=1}^{n-1}E_{p_{i+1}}-E_{p_i}=E_{p_n}-E_{p_1}\),\(E_{p_n}\) 显然就是我们要求的最大值,而 \(E_{p_1}\) 我们肯定希望它越小越好,显然我们会令 \(E_{p_1}\),也就是说最小化 \(\max\limits_{i=1}^nE_i\) 就等价于最小化 \(\sum\limits_{i=1}^{n-1}\text{dist}(p_i,p_{i+1})\),也就是最短的这是一个非常经典的问题,注意到对于一棵树而言,如果我们要求一个以 \(s\) 开头 \(s\) 为根的回路,使其长度最小,那显然一边欧拉序即可,答案即为 \(2(n-1)\),那如果不强制起点和终点相同呢?不难发现这两种情况只差一条终点 \(\to\) 起点的路径,也就是说我们要让终点 \(\to\) 起点的长度尽可能大,那显然树的直径好了,也就是说答案就是 \(2(n-1)+1\) 减树的直径的长度,这个随便乱搞即可。构造就取每个点的 \(E_i\) 为以直径的某一端点为根的 DFS 序下 \(i\) 的入栈时间,正确性证明可借鉴树上莫队,复杂度线性。

const int MAXN=2e5;
int n,hd[MAXN+5],to[MAXN*2+5],nxt[MAXN*2+5],ec=0;
void adde(int u,int v){to[++ec]=v;nxt[ec]=hd[u];hd[u]=ec;}
int dep1[MAXN+5],dep2[MAXN+5],rt1,rt2;
void dfs1(int x,int f){
dep1[x]=dep1[f]+1;
for(int e=hd[x];e;e=nxt[e]) if(to[e]^f) dfs1(to[e],x);
}
void dfs2(int x,int f){
dep2[x]=dep2[f]+1;
for(int e=hd[x];e;e=nxt[e]) if(to[e]^f) dfs2(to[e],x);
}
bool has[MAXN+5];int son[MAXN+5];
void dfs3(int x,int f){
has[x]=(x==rt2);
for(int e=hd[x];e;e=nxt[e]){
int y=to[e];if(y==f) continue;
dfs3(y,x);if(has[y]) has[x]=1,son[x]=y;
}
}
int ans[MAXN+5],tim=0;
void dfs4(int x,int f){
ans[x]=++tim;
for(int e=hd[x];e;e=nxt[e]){
int y=to[e];if(y==f||y==son[x]) continue;
dfs4(y,x);tim++;
} if(son[x]) dfs4(son[x],x),tim++;
}
int main(){
scanf("%d",&n);
for(int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),adde(u,v),adde(v,u);
dfs1(1,0);for(int i=1;i<=n;i++) if(dep1[i]>dep1[rt1]) rt1=i;
dfs2(rt1,0);for(int i=1;i<=n;i++) if(dep2[i]>dep2[rt2]) rt2=i;
dfs3(rt1,0);dfs4(rt1,0);for(int i=1;i<=n;i++) printf("%d%c",ans[i],(i==n)?'\n':' ');
return 0;
}

Atcoder Regular Contest 117 D - Miracle Tree(分析性质+构造)的更多相关文章

  1. AtCoder Regular Contest 083 E - Bichrome Tree

    题目传送门:https://arc083.contest.atcoder.jp/tasks/arc083_c 题目大意: 给定一棵树,你可以给这些点任意黑白染色,并且赋上权值,现给定一个序列\(X_i ...

  2. AtCoder Regular Contest 103 Problem D Robot Arms (构造)

    题目链接  Problem D 给定$n$个坐标,然后让你构造一个长度为$m$的序列, 然后给每个坐标规定一个长度为$m$的序列,ULRD中的一个,意思是走的方向, 每次从原点出发按照这个序列方向,每 ...

  3. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

  4. AtCoder Regular Contest 095

    AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...

  5. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  6. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

  7. AtCoder Regular Contest 102

    AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...

  8. AtCoder Regular Contest 096

    AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...

  9. AtCoder Regular Contest 097

    AtCoder Regular Contest 097 C - K-th Substring 题意: 求一个长度小于等于5000的字符串的第K小子串,相同子串算一个. K<=5. 分析: 一眼看 ...

随机推荐

  1. BUAA 2020 软件工程 软件分析案例作业

    Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件分析案例 我在这个课程的目标是 学习软件 ...

  2. 单片机入门stm32知识学习的先后顺序

    这里大概的罗列了一些学习STM32的内容,以及学习顺序.如果是新手的话,建议边看中文手册和学习视频;如果是已经入门的,个人建议自己做一个项目,不论项目大小,当然里面会涉及到自己已经学习过的,或者是自己 ...

  3. 用Python画如此漂亮的专业插图 ?简直So easy!

    本文整理自知乎问答,仅用于学术分享,著作权归作者所有.如有侵权,请联系我删文处理.多多转发,多多学习! 方法一 强烈推荐 Python 的绘图模块 matplotlib: python plottin ...

  4. 21.8.7 test

    \(NOIP\) 测试 考的一般般. \(T1\) WOJ4656 签到题,其实就是算 \(\sum\limits_{i=1}^n i^2\) #include<bits/stdc++.h> ...

  5. https的加密解密过程

    前置知识 SSL是90年代Netscape弄出来的一套东西,为的是解决HTTP协议明文传输数据的问题.后来SSL慢慢成了事实上的标准,于是IETF就把SSL标准化了,名字叫做TLS,TLS 1.0其实 ...

  6. SpringCloud微服务实战——搭建企业级开发框架(十一):集成OpenFeign用于微服务间调用

    作为Spring Cloud的子项目之一,Spring Cloud OpenFeign以将OpenFeign集成到Spring Boot应用中的方式,为微服务架构下服务之间的调用提供了解决方案.首先, ...

  7. Ubuntu 16.04 菜单栏 换位置 挪到左边 挪到下边

    Ubuntu菜单栏的位置可以调 到左侧 或者底部 调整到底部 $ gsettings set com.canonical.Unity.Launcher launcher-position Bottom ...

  8. 攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup

    攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup 题目介绍 题目考点 模板注入 Writeup 进入题目 import flask import os a ...

  9. Jmeter 正则表达式提取Response Headers,Response Body里的值

    实践过程中遇到需要提取Response Headers,Response Body里的值 一.获取Response Body的值,这里采用json提取器形式 1.Response Body返回值,如下 ...

  10. linux下安装Git并生成SSH key

    系统:contens7.4 1.下载源码解压 wget https://github.com/git/git/archive/v2.3.0.zip unzip v2.3.0.zip cd git-2. ...