题目描述

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)相关推荐

  1. 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 ...

  2. Helvetic Coding Contest 2019 online mirror (teams allowed, unrated)

    http://codeforces.com/contest/1184 A1 找一对整数,使x^x+2xy+x+1=r 变换成一个分式,保证整除 #include<iostream> #in ...

  3. 【HDU - 5988】Coding Contest(网络流费用流,改模板)

    题干: A coding contest will be held in this university, in a huge playground. The whole playground wou ...

  4. Coding Contest HDU - 5988

    Coding Contest HDU - 5988 题意: 有n个点,m个边,每个点有人数和食物数,每个人都要吃一份食物,如果该点的食物不够,他们就要去其他点,每个边最多只能走c次,每次有人走一条路, ...

  5. HDU - 5988 Coding Contest(最大费用最大流+思维建边)

    题目链接:点击查看 题目大意:给出n个点和m条边,每个点有ai个人和bi份食物,每条边最多能通过ci个人,以及除了第一个人之外,其他人通过每条边触电的概率为pi,在以上约束下,要求每个人都必须吃到一份 ...

  6. 【最小费用最大流(改进Dijkstra)】2016 icpc 青岛 G - Coding Contest

    题目:https://vjudge.net/contest/412116#problem/G 题意:t组样例,n个点,每个点有sis_isi​个人和bib_ibi​份物资.m条边,每条边从第二次开始, ...

  7. Codeforces 802 补题

    codeforces802 A-O Helvetic Coding Contest 2017 online mirror  A  Heidi and Library (easy) 水题 同B #inc ...

  8. (转)The Neural Network Zoo

    转自:http://www.asimovinstitute.org/neural-network-zoo/ THE NEURAL NETWORK ZOO POSTED ON SEPTEMBER 14, ...

  9. DL:深度学习算法(神经网络模型集合)概览之《THE NEURAL NETWORK ZOO》的中文解释和感悟(一)

    DL:深度学习算法(神经网络模型集合)概览之<THE NEURAL NETWORK ZOO>的中文解释和感悟(一) 目录 THE NEURAL NETWORK ZOO perceptron ...

最新文章

  1. 简单工厂、工厂模式初学习
  2. 强大的代码扫描工具SonarLint之安装使用
  3. 重温JSP学习笔记--El表达式
  4. 避免强光的一些注意点
  5. int、bigint、mediumint、smallint、tinyint的比较
  6. 精通Android开发 1
  7. spring cloud gateway 网关_微服务网关Spring Cloud Gateway全搞定
  8. mongodb数据库扩展名_MongoDB权威指南
  9. 手机辐射到底有多厉害!65分钟将生鸡蛋煮熟
  10. javascript中addEventListener与removeEventListener
  11. [原创] 在XP/2K 下实现 Win+Ctrl+Del 等键的屏蔽的方法,附源码与演示程序下载。...
  12. Android酷欧天气实训报告书,建筑实训报告范文共6篇(10页)-原创力文档
  13. PencilWang博客目录
  14. 梯度下降法中的参数学习速率如何选择
  15. 联想r720自带杜比驱动下载_给心爱的本本装上杜比音效
  16. 自己制作一个小程序需要多少钱
  17. linux投影手机,linux连接投影机方法介绍
  18. php模拟安卓端捉取数据,ios - PHP如何模拟安卓设备,请求API接口的数据
  19. scrollTo()方法
  20. 一次因reactor-netty bug导致springcloud gateway请求积压问题处理

热门文章

  1. Android 天天动听 悬浮歌词(迷你歌词)效果解读
  2. 一开关控制两个灯c语言编程,如何实现楼梯踏步灯用两个反射感应开关控制两台led编程控制器...
  3. linux 浏览器重定向,nginx 重定向浏览器url跳转和不跳转两种需求
  4. Geomagic Studio 调整模型的倾斜角度
  5. vue 封装js常用工具函数包
  6. C语言 删除数组中重复的元素
  7. python基础练习--求岁数问题
  8. linux 触屏测试
  9. 小米pro 笔记本 计算机,小米笔记本pro,比差大赛,看了小米笔记本Pro 8250u解锁记。...
  10. 洛谷 P3654 First Step (ファーストステップ)