这是一道并查集的简单维护题
题目链接(luogu)
CodeForces

题意

给出一棵森林,有两种操作
1。1 ^。1。 给出点 xxx,输出点 xxx 所在的树的直径
2。2 ^。2。 给出点 x,yx,yx,y,(如果 x,yx,yx,y 在同一棵树中则忽略此操作)选择任意两点 u∈xu \in xu∈x所在子树, v∈yv \in yv∈y所在子树 ,将 u,vu,vu,v 之间连一条边,使得连边后的到的新树的直径最小。

思路

首先考虑查询操作:
我们用两遍 dfsdfsdfs 求出每一颗子树树的直径,并顺便更新每一个点的从属情况
接下来考虑合并操作:
因为是使新树的直径最小
而这个直径的更新从三个方面来
dnew=min(dx,dy,⌈dx2⌉+⌈dy2⌉2+1)d_{new} = min(d_x, d_y, \frac{\lceil \frac{d_x}{2} \rceil + \lceil \frac{d_y}{2} \rceil}{2} + 1)dnew​=min(dx​,dy​,2⌈2dx​​⌉+⌈2dy​​⌉​+1)
故可以在合并的时候将新树的ddd维护出来

代码

具体实现见代码:

const int N = 3e5 + 5;
int n, m, q, mxindex, mxval, fa[N], d[N], belong;
vector<int> G[N];
void dfs(int x, int pre, int sum)
{fa[x] = belong;if (sum > mxval){mxindex = x;mxval = sum;}for (auto it : G[x])if (it != pre)dfs(it, x, sum + 1);
}
int findset(int x)
{return fa[x] == x ? fa[x] : fa[x] = findset(fa[x]);
}
void merge(int x, int y)
{x = findset(x), y = findset(y);if (x != y){if (d[x] < d[y])swap(x, y);d[x] = max(d[x], (d[x] + 1) / 2 + (d[y] + 1) / 2 + 1);fa[y] = x;}
}
int main()
{rd(n), rd(m), rd(q);for (int i = 1; i <= n; i++)fa[i] = i;for (int i = 1, x, y; i <= m; i++)rd(x), rd(y), G[x].push_back(y), G[y].push_back(x);for (int i = 1; i <= n; i++)if (fa[i] == i){belong = i;mxindex = mxval = 0;dfs(i, 0, 0);belong = mxindex;dfs(mxindex, 0, 0);d[belong] = mxval;}while (q--){int opt, x, y;rd(opt), rd(x);if (opt == 1)printf ("%d\n", d[findset(x)]);elserd(y), merge(x, y);}return 0;
}

Thanks!

CF455C Civilization Solution相关推荐

  1. 2020 年百度之星·程序设计大赛 - 初赛一 Civilization BFS广搜

    problem Civilization Accepts: 619 Submissions: 2182 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  2. SharePoint【调试,诊错系列】-- 一种调试Sharepoint2010 Solution的快捷方式

    Visual Studio 2010 支持通过F5来调试Sharepoint Solutions,但这种方法却很难用在调试workflows, event recievers, custom cont ...

  3. 什么是Closed-form solution?

    最近看论文,讨论微分方程解时遇到closed-form solution概念,上网检索,找到一个较浅显易懂的解释如下. 与工学院所学的微分方程不同的是,工学院的学生一般都是学如何把特定的微分方程的解用 ...

  4. Java was not the perfect solution for every pro...

    为什么80%的码农都做不了架构师?>>> When I started writing From Java to Ruby, I had a good idea that Java ...

  5. 一、ExtMail Solution概述--EXTMAIL

    1.版权声明 本文版权归作者所有,如其他个人.第三方网站或媒体报刊等需转载全文或节选,为支持我们的工作,请务必注明如下信息:文档所有者:Extmail Dev Team;文章原始出处:http://w ...

  6. 影像组学视频学习笔记(43)-标准差、标准误及95%置信区间CI、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/f09d0f97592f 来源:简书,已获授权转载 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(43)主要 ...

  7. 影像组学视频学习笔记(42)-影像组学特征提取问题解决过程复现、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/c3e6de2f79b3 来源:简书,已获转载授权 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(42)主要 ...

  8. 影像组学视频学习笔记(41)-如何使用软件提取组学特征、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/72186eb3e395 来源:简书,已获授权转载 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(41)主要 ...

  9. 影像组学视频学习笔记(37)-机器学习模型判断脑卒中发病时间(文献报告)、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/3e7a2c84288e 来源:简书,已获授权转载 RadiomicsWorld.com "影像组学世界" ...

最新文章

  1. 亲历惊心48小时抢救35亿交易数据
  2. c#_关键字base
  3. C语言 | 编程实现4
  4. java英语介绍_java,英文介绍项目.doc
  5. go编译go-gtk报错
  6. Xmodem、Ymodem、Zmodem
  7. js获取DIV的位置坐标的三种方法!
  8. 开源游戏《一小时人生》GitHub仓库被删,CEO亲自道歉
  9. Emacs收发email
  10. 如何在Spring容器中加载自定义的配置文件
  11. 史上最全Java学习视频下载地址分享
  12. ACM题库,分类整理
  13. OpenCV-python显示图片时图片比窗口大的解决办法
  14. linux进程假死的原因_linux下程序假死
  15. 魔窗--H5网页唤醒APP
  16. python把英语句子成分字母_如何标注英语句子成分?
  17. sinc插值原理及其实现
  18. 软链接解决存储空间不足
  19. 海湾gst5000主机消防广播_海湾GST5000消防主机常见问题及解决!
  20. NIUSHOP wap端广告页面设置

热门文章

  1. 微软新技术展望大会 -- 比尔·盖茨演讲全文及问答
  2. 灵动ICPC冬令营基础-2
  3. JSP与ASP.Net之间的Session值共享
  4. 培养兴趣可以学丙烯画吗?学丙烯画有什么要求?
  5. 计算机软件选修课选什么好,大学选修课最火的课程 哪个选修课好过
  6. Windows端 五款 MySQL 客户端工具
  7. 【ArcGIS】连接到数据库失败,出现基础数据库错误,没有注册类
  8. 卡哇伊非主流美女教程(恶搞版)
  9. C# 跨窗口调用函数
  10. Slab Allocator