题解 P2195 【HXY造公园】
天哪这道题竟然只有一篇题解!
emm,首先读题看完两个操作就已经有很明确的思路了,显然是并查集+树的直径 一波解决。
并查集不多说了,如果不了解的可以看这里.
树的直径的思路很朴实,就是两边DFS(BFS也OK)。具体先随便找一个节点,然后搜一遍,找到最远的,然后再搜一遍,这样合在一起就一定是最长的了。
不过呢这道题还是注意一下求直径的公式,具体如下:
$D_new=max(D_u,D_v,[D_u/2]+[D_v/2]+1)$
那个方括号指的是取整(没找到在哪里打出来)。
en除此之外好像没什么好说的。。。
AC代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std; const int maxn=; int n,m,q,max_i,max_v;
int f[maxn],len[maxn],sz[maxn];
bool used[maxn];
vector<int>g[maxn]; void dfs(int val,int depth,int pos){
if(depth>max_i){
max_i=depth;
max_v=val;
}
for(int i=;i<g[val].size();i++){
if(g[val][i]!=pos)dfs(g[val][i],depth+,val);
}
} int calc(int val){
max_i=-;
dfs(val,,-);
max_i=-;
dfs(max_v,,-);
return max_i;
} int find(int x){
if(x==f[x])return x;
return f[x]=find(f[x]);
} void merge(int x,int y){
x=find(x),y=find(y);
if(sz[x]>sz[y])swap(x,y);
sz[y]+=sz[x];
f[x]=y;
} int radius(int x){
return (len[x]+)/;
} void merge2(int x,int y){
x=find(x),y=find(y);
if(x==y)return;
if(sz[x]>sz[y])swap(x,y);
sz[y]+=sz[x];
f[x]=y;
len[y]=max(max(radius(x)+radius(y)+,len[x]),len[y]);
} int main() {
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=n;i++){
f[i]=i;
sz[i]=i;
len[i]=;
}
for(int i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
merge(x,y);
}
for(int i=;i<=n;i++){
int p=find(i);
if(!used[p]){
used[p]=;
len[p]=calc(i);
}
}
while(q--){
int t,x,y;
scanf("%d",&t);
if(t==){
scanf("%d",&x);
printf("%d\n",len[find(x)]);
}else{
scanf("%d%d",&x,&y);
merge2(x,y);
}
}
}
题解 P2195 【HXY造公园】的更多相关文章
- 洛谷 P2195 HXY造公园
P2195 HXY造公园 题目描述 现在有一个现成的公园,有n个休息点和m条双向边连接两个休息点.众所周知,HXY是一个SXBK的强迫症患者,所以她打算施展魔法来改造公园并即时了解改造情况.她可以进行 ...
- 洛谷 P2195 HXY造公园 解题报告
P2195 HXY造公园 题目描述 现在有一个现成的公园,有\(n\)个休息点和\(m\)条双向边连接两个休息点.众所周知,\(HXY\)是一个\(SXBK\)的强迫症患者,所以她打算施展魔法来改造公 ...
- 【luogu P2195 HXY造公园】 题解
题目链接:https://www.luogu.org/problemnew/show/P2195 fir.吐槽题目(省略1w字 sec.考虑对一个森林的维护,每棵树用并查集维护. 操作1:输出当前查询 ...
- CF455C Civilization | luogu HXY造公园
题目链接: https://www.luogu.org/problemnew/show/P2195 http://codeforces.com/contest/455/problem/C 显然我们可以 ...
- 【题解】NOIP2017逛公园(DP)
[题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...
- NOIP前刷题记录
因为本蒻实在太蒻了...对于即将到来的NOIP2018ssfd,所以下决心要把自己近期做过的题目(衡量标准为洛谷蓝题难度或以上)整理一下,归归类,简单地写一下思路,就当作自己复习了吧qwq 本随笔持续 ...
- NOIP刷题
搜索 [NOIP2013]华容道 最短路+带剪枝的搜索,是一个思维难度比较大的题目. CF1064D Labyrinth 考虑贪心,用双向队列bfs [NOIP2017]宝藏 剪枝搜索出奇迹 题解:h ...
- 【图论 动态规划拆点】luoguP3953 逛公园
经典的动态规划拆点问题. 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 NN 个点 MM 条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口, NN 号点是公园的出口,每条边有一个非负 ...
- poj1083 贪心
K - 简单dp Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:10000KB 64bit ...
随机推荐
- 乌班图 之 Ubuntu 16.04 LTS连接无线上网炒鸡慢问题!!!
用VMware装了Ubuntu 16.04 LTS后连接无线上网,发现出奇的慢. 果断感觉有问题,立马找度娘,果然有问题!!! 网上查找亲测有效的方法为: 在终端运行:sudo gedit /etc/ ...
- Android学习——LinearLayout布局实现居中、左对齐、右对齐
android:orientation="vertical"表示该布局下的元素垂直排列: 在整体垂直排列的基础上想要实现内部水平排列,则在整体LinearLayout布局下再创建一 ...
- 读取XML字符串到临时表
DECLARE @hdoc int DECLARE @doc xml SET @doc = '<CityValueSet> <CityItem> <CityId>2 ...
- HDU 4190 Distributing Ballot Boxes【二分答案】
题意:给出n个城市,n个城市分别的居民,m个盒子,为了让每个人都投上票,问每个盒子应该装多少张票 二分盒子装的票数, 如果mid<=m,说明偏大了,r应该向下逼近 ,r=mid 如果mid> ...
- 优动漫PAINT-朱槿花的画法
火红夺目的朱槿花,绝对是烘托画面的绝佳布景!画法发非常简单,毫无绘画基础的人也能够将它很好的呈现出来哟~ 教程是简单,呃.... 没有优动漫PAINT软件肿么办? 别着急,╭(╯^╰)╮ 小编给你送来 ...
- html转word文档
html转word文档 package cn.com.szhtkj.util; import java.io.ByteArrayInputStream; import java.io.File; im ...
- IDEA创建Maven项目显示一直加载中的问题
使用IDEA这款工具创建Maven项目的时候出现过下面这种情况: 红色区域即maven骨架加载不出来... 或 loading loading loading ... 有时候需要很长一段时间才能加载出 ...
- WCF客户端获取服务端异常[自定义异常]
引言 经过不断的摸索,询问/调试,终于学会了关于WCF客户端与服务端之间异常的处理机制,在此来记录自己的成果,用于记录与分享给需要的伙伴们. 首先感谢[.NET技术群]里群主[轩]的大力帮助,如有需要 ...
- Python链表
class Node: ''' 节点类 链表节点结构 data next data: 节点保存的数据 _next: 保存下一个节点对象 ''' def __init__(self, data, pne ...
- 紫书 习题11-11 UVa 1644 (并查集)
这道题感觉思路非常巧妙, 我是看了别人的博客才想明白的. 这里用到了并查集, 以根节点为中心城市, 然后把边从大到小排序, 每次的当前的边即为容量, 因为是目前的最小值, 然后去算总的容量, 每次选容 ...