Atcoder Regular Contest 117 D - Miracle Tree(分析性质+构造)
笑死,阴间语文作业到现在还没写完,为了在这个点保持精神,我只好来颓篇题解辣
我们考虑探究一下怎么最小化 \(\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(分析性质+构造)的更多相关文章
- AtCoder Regular Contest 083 E - Bichrome Tree
题目传送门:https://arc083.contest.atcoder.jp/tasks/arc083_c 题目大意: 给定一棵树,你可以给这些点任意黑白染色,并且赋上权值,现给定一个序列\(X_i ...
- AtCoder Regular Contest 103 Problem D Robot Arms (构造)
题目链接 Problem D 给定$n$个坐标,然后让你构造一个长度为$m$的序列, 然后给每个坐标规定一个长度为$m$的序列,ULRD中的一个,意思是走的方向, 每次从原点出发按照这个序列方向,每 ...
- AtCoder Regular Contest 093
AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...
- AtCoder Regular Contest 095
AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...
- AtCoder Regular Contest 092
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...
- AtCoder Regular Contest 094
AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...
- AtCoder Regular Contest 102
AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...
- AtCoder Regular Contest 096
AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...
- AtCoder Regular Contest 097
AtCoder Regular Contest 097 C - K-th Substring 题意: 求一个长度小于等于5000的字符串的第K小子串,相同子串算一个. K<=5. 分析: 一眼看 ...
随机推荐
- 用css写三角形
html部分 <div class="triangle></div> css部分 .triangle{ width:0; height:0; overflow:hid ...
- 编程题:X星人的金币
X星人的金币 时问限制:3000MS 内存限制:589824KB 题目描述: X是人在一艘海底沉船上发现了很多很多很多金币.可爱的X星人决定用这些金币来玩一个填格子的游戏.其规则如下:第1个格子放2枚 ...
- 【UE4 材质】一些小功能
利用材质实现物体自转 物体外轮廓高亮 使用postprocess+custom depth(防遮挡) https://www.tomlooman.com/soft-outlines-in-ue4/ h ...
- 计算机网络:HTTP
计算机网络基础:HTTP 先验知识 HTTP和其他协议的关系 通过下图,了解IP协议,TCP协议,DNS服务在使用HTTP协议通信过程中各自发挥的作用: 服务器处理流程 接受客户端连接 ------& ...
- UltraSoft - DDL Killer - Alpha 项目展示
团队介绍 CookieLau fmh 王 FUJI LZH DZ Monster PM & 后端 前端 前端 前端 后端 后端 软件介绍 项目简介 项目名称:DDLKiller 项目描述:&q ...
- 混合开发框架Flutter
Flutter开发简介与其他的混合开发的对比 为什么要使用Flutter? 跨平台技术简介 Hybrid技术简介 QT简介 Flutter简介 为什么要使用Flutter? Flutter有什么优势? ...
- 零基础小白要如何跟好的学习嵌入式Linux(转)
作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会). C语言要学 ...
- MyBatis源码分析(二):MyBatis整体架构及原理
一.Mybatis整体架构导图 二.Mybatis的核心组成 SqlSessionFactoryBuilder(构造器): 根据配置信息(XML)生成SqlSessionFactory工厂接口,构造器 ...
- python读取、写入txt文本内容
转载:https://blog.csdn.net/qq_37828488/article/details/100024924 python常用的读取文件函数有三种read().readline().r ...
- Ubuntu mysql安装与使用
Ubuntu 下安装 mysql 运行下面的shell代码 #安装mysql sudo apt-get -y install mysql-server sudo apt-get -y install ...