CF 690C3. Brain Network (hard) from Helvetic Coding Contest 2016 online mirror (teams, unrated)
题目描述
Brain Network (hard) 这个问题就是给出一个不断加边的树,保证每一次加边之后都只有一个连通块(每一次连的点都是之前出现过的),问每一次加边之后树的直径。
算法
每一次增加一条边之后,树的直径长度要么不变,要么会增加1,并且如果树的直径长度增加1了,新的直径的端点其中一个必然是新增的点,而另一个是原来直径的某个端点。关于为什么可以这样做,在Quora上有个回答解释地不错,可以参考。
实现
所以这个问题其实就是要计算树上任意两个点的距离,LCA可以很轻松地处理。
可以一次性先把数据都读完,建树,因为每一次询问,后面加入的边不会对当前询问造成影响。
如果用二进制祖先那种搞法来算LCA的话,也可以每读一个新增点就去算一下,相当于是把原来的过程给拆开了。
下面是我的代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>using namespace std;const int N = 223456;struct Edge {int to, next;
} edge[N << 1];
int idx = 1, head[N];void addEdge(int u, int v) {edge[++idx].to = v;edge[idx].next = head[u];head[u] = idx;
}void init() {memset(head, 0, sizeof(head));idx = 1;
}int par[N][21];
int dep[N];void dfs(int u, int fa, int d) {dep[u] = d;for (int k = head[u]; k; k = edge[k].next) {int v = edge[k].to;if (v == fa) continue;par[v][0] = u;dfs(v, u, d + 1);}
}void calc(int n) {for (int i = 1; i <= 20; i++) {for (int j = 1; j <= n; j++) {par[j][i] = par[par[j][i - 1]][i - 1];}}
}int kthA(int u, int k) {for (int i = 20; i >= 0; i--) {if (k >= (1 << i)) {k -= (1 << i);u = par[u][i];}}return u;
}int lca(int u, int v) {if (dep[u] < dep[v])swap(u, v);u = kthA(u, dep[u] - dep[v]);if (u == v)return u;for (int i = 20; i >= 0; i--) {if (par[u][i] == par[v][i])continue;u = par[u][i];v = par[v][i];}return par[u][0];
}bool update(int u, int v, int &k) {int a = lca(u, v);int d = dep[u] + dep[v] - 2 * dep[a];if (d > k) {k = d;return true;}return false;
}int a[N];int main() {int n;scanf("%d", &n);int u = 1, v = 1, cur = 0;init();for (int i = 2; i <= n; i++) {scanf("%d", a + i);addEdge(a[i], i);}dfs(1, -1, 0);calc(n);for (int i = 2; i <= n; i++) {int nv = v;if (update(u, i, cur)) {nv = i;}if (update(v, i, cur)) {u = v;nv = i;}v = nv;printf("%d ", cur);}puts("");return 0;
}
转载于:https://www.cnblogs.com/micrari/p/5740897.html
CF 690C3. Brain Network (hard) from Helvetic Coding Contest 2016 online mirror (teams, unrated)相关推荐
- Helvetic Coding Contest 2018 online mirror (teams allowed, unrated) C2.Encryption (medium)
传送门:Encryption(medium) 题意:N个数,分成k个连续的序列,把每个序列的数累加取模p,求k个取模结果累加的最大值. 分析:DP, 复杂度O(Nkp) 设dp[i][j]为取模结果i ...
- Helvetic Coding Contest 2019 online mirror (teams allowed, unrated)
http://codeforces.com/contest/1184 A1 找一对整数,使x^x+2xy+x+1=r 变换成一个分式,保证整除 #include<iostream> #in ...
- 【HDU - 5988】Coding Contest(网络流费用流,改模板)
题干: A coding contest will be held in this university, in a huge playground. The whole playground wou ...
- Coding Contest HDU - 5988
Coding Contest HDU - 5988 题意: 有n个点,m个边,每个点有人数和食物数,每个人都要吃一份食物,如果该点的食物不够,他们就要去其他点,每个边最多只能走c次,每次有人走一条路, ...
- HDU - 5988 Coding Contest(最大费用最大流+思维建边)
题目链接:点击查看 题目大意:给出n个点和m条边,每个点有ai个人和bi份食物,每条边最多能通过ci个人,以及除了第一个人之外,其他人通过每条边触电的概率为pi,在以上约束下,要求每个人都必须吃到一份 ...
- 【最小费用最大流(改进Dijkstra)】2016 icpc 青岛 G - Coding Contest
题目:https://vjudge.net/contest/412116#problem/G 题意:t组样例,n个点,每个点有sis_isi个人和bib_ibi份物资.m条边,每条边从第二次开始, ...
- Codeforces 802 补题
codeforces802 A-O Helvetic Coding Contest 2017 online mirror A Heidi and Library (easy) 水题 同B #inc ...
- (转)The Neural Network Zoo
转自:http://www.asimovinstitute.org/neural-network-zoo/ THE NEURAL NETWORK ZOO POSTED ON SEPTEMBER 14, ...
- DL:深度学习算法(神经网络模型集合)概览之《THE NEURAL NETWORK ZOO》的中文解释和感悟(一)
DL:深度学习算法(神经网络模型集合)概览之<THE NEURAL NETWORK ZOO>的中文解释和感悟(一) 目录 THE NEURAL NETWORK ZOO perceptron ...
最新文章
- 简单工厂、工厂模式初学习
- 强大的代码扫描工具SonarLint之安装使用
- 重温JSP学习笔记--El表达式
- 避免强光的一些注意点
- int、bigint、mediumint、smallint、tinyint的比较
- 精通Android开发 1
- spring cloud gateway 网关_微服务网关Spring Cloud Gateway全搞定
- mongodb数据库扩展名_MongoDB权威指南
- 手机辐射到底有多厉害!65分钟将生鸡蛋煮熟
- javascript中addEventListener与removeEventListener
- [原创] 在XP/2K 下实现 Win+Ctrl+Del 等键的屏蔽的方法,附源码与演示程序下载。...
- Android酷欧天气实训报告书,建筑实训报告范文共6篇(10页)-原创力文档
- PencilWang博客目录
- 梯度下降法中的参数学习速率如何选择
- 联想r720自带杜比驱动下载_给心爱的本本装上杜比音效
- 自己制作一个小程序需要多少钱
- linux投影手机,linux连接投影机方法介绍
- php模拟安卓端捉取数据,ios - PHP如何模拟安卓设备,请求API接口的数据
- scrollTo()方法
- 一次因reactor-netty bug导致springcloud gateway请求积压问题处理
热门文章
- Android 天天动听 悬浮歌词(迷你歌词)效果解读
- 一开关控制两个灯c语言编程,如何实现楼梯踏步灯用两个反射感应开关控制两台led编程控制器...
- linux 浏览器重定向,nginx 重定向浏览器url跳转和不跳转两种需求
- Geomagic Studio 调整模型的倾斜角度
- vue 封装js常用工具函数包
- C语言 删除数组中重复的元素
- python基础练习--求岁数问题
- linux 触屏测试
- 小米pro 笔记本 计算机,小米笔记本pro,比差大赛,看了小米笔记本Pro 8250u解锁记。...
- 洛谷 P3654 First Step (ファーストステップ)