暂无链接

离家出走

【问题描述】

**横看成岭侧成峰,远近高低各不同。 **

企鹅豆豆考试爆零了,心态爆炸的他准备离家出走。

贫穷的企鹅国有N座城市,一开始城市之间没有道路连接不能通行。随着时间推移,一些道路逐渐建立。但由于国家财力实在不足,所以随时随地任意两座城市最多只有一条路径可以互相到达。

每次豆豆考试爆炸,他都想从考场里跑到离考场最远的一个城市去。当然豆豆每次都会想知道,最远的且可以到达的城市离考场所在城市有多远?

奇妙的事情是,企鹅国的每一条道路长度都是1。

【输入格式】

第一行一个整数type,表示数据类型。

接下来第二行两个整数N,Q,表示城市个数和事件个数。

接下来Q行,先读入一个整数op,表示事件类型。

如果op=1,那么接着有两个整数u,v,表示城市u和城市v之间建立了一条新的道路。

如果op=2,那么接着有一个整数u,表示这次考试的考场在城市u,豆豆想知道最远的城市离考场有多远。

如果type=1,令上一次op=2时的答案为lastans,那么对于输入的每一个u或者v都需要异或上lastans。(lastans初始为0。)

如果type=0,那么不需要进行其余额外操作。

【输出格式】

对于每次op=2的询问,输出一行一个整数表示离考场最远的城市距离考场的距离。

【输入样例】

0
5 10
1 4 5
2 3
2 5
2 1
1 5 3
1 1 4
2 3
2 5
1 5 2
2 1

【输出样例】

0
3
2
3

【数据范围】

对于20%20\%20%的输入数据:N≤5000,Q≤10000N≤5000,Q≤10000N≤5000,Q≤10000。

对于50%50\%50%的输入数据:N≤100000,Q≤200000N≤100000,Q≤200000N≤100000,Q≤200000。

对于另外20%20\%20%的输入数据:type=0type=0type=0。

对100%100\%100%的输入数据:N≤300000,Q≤500000N≤300000,Q≤500000N≤300000,Q≤500000,道路的修建会满足,随时随地图中不存在环。

题解

因为要求离自己最远的点,又保证随时都是棵,所以我们可以想到树的直径~~(* 的我怎么没想到)~~,离某个点最远的点一定是直径的两个端点中的一个。

所以我们大力LCT\mathcal{LCT}LCT维护树的直径,当两棵树合并的时候,新的直径的两个端点一定是原来的四个端点中的两个,分666种情况讨论来更新直径端点即可。

出题人题解:

LCT天下第一!!!!

代码
#include<bits/stdc++.h>
#define ls son[v][0]
#define rs son[v][1]
using namespace std;
const int M=3e5+5;
int dad[M],son[M][2],sum[M],le[M],ri[M],f[M],n,q,tot,typ;
char ch[5];
bool rev[M];
bool notroot(int v){return son[dad[v]][0]==v||son[dad[v]][1]==v;}
void up(int v){sum[v]=sum[ls]+sum[rs]+1;}
void turn(int v){swap(ls,rs);rev[v]^=1;}
void push(int v){if(!rev[v])return;if(ls)turn(ls);if(rs)turn(rs);rev[v]=0;}
void down(int v){if(notroot(v))down(dad[v]);push(v);}
void spin(int v)
{int f=dad[v],ff=dad[f],k=son[f][1]==v,w=son[v][!k];if(notroot(f))son[ff][son[ff][1]==f]=v;son[v][!k]=f,son[f][k]=w;if(w)dad[w]=f;dad[f]=v,dad[v]=ff;up(f);
}
void splay(int v)
{down(v);int f,ff;while(notroot(v)){f=dad[v],ff=dad[f];if(notroot(f))spin((son[f][0]==v)^(son[ff][0]==f)?v:f);spin(v);}up(v);
}
void access(int v){for(int f=0;v;v=dad[f=v])splay(v),rs=f,up(v);}
void beroot(int v){access(v),splay(v),turn(v);}
void link(int x,int y){beroot(x),dad[x]=y;}
int dis(int x,int y){beroot(x),access(y),splay(y);return sum[y]-1;}
int find(int v){return f[v]==v?v:f[v]=find(f[v]);}
void in(){scanf("%d%d%d",&typ,&n,&q);}
void ac()
{int op,x,y,last=0,l1,l2,l3,l4,l5,l6;for(int i=1;i<=n;++i)f[i]=le[i]=ri[i]=i;while(q--){scanf("%d%d",&op,&x);if(typ)x^=last;if(op==1){scanf("%d",&y);if(typ)y^=last;link(x,y);x=f[y]=find(x);l1=dis(le[x],ri[x]),l2=dis(le[y],ri[y]),l3=dis(le[x],ri[y]),l4=dis(le[y],ri[x]),l5=dis(le[x],le[y]),l6=dis(ri[y],ri[x]);if(l2>=l1&&l2>=l3&&l2>=l4&&l2>=l5&&l2>=l6)le[x]=le[y],ri[x]=ri[y];else if(l3>=l1&&l3>=l2&&l3>=l4&&l3>=l5&&l3>=l6)ri[x]=ri[y];else if(l4>=l1&&l4>=l2&&l4>=l3&&l4>=l5&&l4>=l6)le[x]=le[y];else if(l5>=l1&&l5>=l2&&l5>=l3&&l5>=l4&&l5>=l6)ri[x]=le[y];else if(l6>=l1&&l6>=l2&&l6>=l3&&l6>=l4&&l6>=l5)le[x]=ri[y];}else y=find(x),printf("%d\n",last=max(dis(le[y],x),dis(ri[y],x)));}
}
int main(){in();ac();}

[2018.07.21 T2] 离家出走相关推荐

  1. 【跃迁之路】【531天】程序员高效学习方法论探索系列(实验阶段288-2018.07.21)...

    @(跃迁之路)专栏 [跃迁之路]奖励金计划正式开始 从2018.7.1起,[跃迁之路]奖励金计划正式起航,从今以后,每月1日,我会将自己个人上月收入的1%计入[跃迁之路]奖励金池,积累到足够金额后,将 ...

  2. 2018.07.19 仿优酷网页小项目

    时间:2018.07.19 大一下学期暑假 地点:成都-实习 项目类型:HTML+CSS仿优酷网页 制作时间:两天 网页源码: <!doctype html> <html> & ...

  3. RedHat6.5虚拟机架设Redis和Kafka伪集群(2018.8.21最新重要补充!)

    架设Redis: 虚拟机架设,桥接模式下要保证实体机能上网,这样虚拟机才会分配到一个ip(这里是192.168.43.105),方便下面的集群配置每个节点ip,伪集群都设置成一个, 但要保证这个ip网 ...

  4. 2018.01.21.一周机器学习周记

    时间:2018.01.21.一周 主要内容 1.整理前期关于决策树的一个小型实践项目文档(实践进行中) 2.搭建TensorFlow环境(进行中) 3.拓展:实践Python的自动化模块pyautog ...

  5. 2018.07.30 巴别时代

    * 项目部署更新 用符号链接 project => project1, project2 ln -s project2 project * composer自动加载机制 namespace =& ...

  6. Microsoft Artificial Intelligence Conference(2018.05.21)

    时间:2018.05.21 地点:北京嘉丽大酒店 转载于:https://www.cnblogs.com/xuefeng1982/p/10335943.html

  7. 【跃迁之路】【440天】刻意练习系列199(2018.04.21)

    @(跃迁之路)专栏 叨叨两句 技术的精进不能只是简单的刷题,而应该是不断的"刻意"练习 该系列改版后正式纳入[跃迁之路]专栏,持续更新 一.SQL [跃迁之路]Java基础--SQ ...

  8. 暑期训练日志----2018.8.21

    训练第23天. 上午开始的状压DP,一开始看的迷迷糊糊的,翻了大量的资料看了一上午算是入门了,但要写还是写不出来. 下午组队打比赛,刚开始服务器又崩了,心态爆炸...一个巨水的题写半天没写出来,全队磨 ...

  9. vue-cli脚手架npm run build打包后图片路径问题 2018.11.21

    2018/11/21 最近在自己尝试做一个vue的项目,发现了一个打包以后出现的路径问题 使用npm run dev 可以正常打开项目,图片路径不会出错,使用脚手架npm run build 打包以后 ...

  10. 服务器离家出走怎么修复,减肥减到“大姨妈”离家出走?教你几招把它找回来!...

    原标题:减肥减到"大姨妈"离家出走?教你几招把它找回来! 大家好,我是九姑娘. 九真的经常会在后台收到关于"大姨妈"的问题: 你说这位"亲戚" ...

最新文章

  1. Science长文综述:通过空间斑图形成避免复杂系统崩溃
  2. 静态网页制作html语言入门
  3. Netflix:通过可视化和统计学改进用户QoE
  4. sqlserver55555_sqlserver把小数点后面多余的0去掉
  5. 预编译对象解决SQL注入问题
  6. 【JAVA 第三章 流程控制语句】课后习题 月历打印
  7. 写了一个验证数字范围的正则表达式
  8. 拷贝linux系统镜像
  9. 处理机调度之时间片轮转调度算法实现
  10. 黑群晖DSM7.1.0物理机安装教程
  11. Android 8.1 Launcher3实现动态指针时钟
  12. 用python来做一个APP | python GUI 基础(实战)
  13. 我们的地盘,我们做主
  14. 全文 40000 字,最强(全) Matplotlib 实操指南
  15. 2018年中考计算机考试成绩,2018年中考分数线
  16. 多任务学习(Multi-task Learning)方法总结
  17. 计算机毕业设计(论文+代码+数据库+查重)
  18. 大四实习两个月的体会
  19. 博士申请 | 香港大学倪卓娴教授招收机器学习和智慧物联网方向全奖博士生
  20. Linux命令查看子进程命令,Linux基础命令——查看进程命令

热门文章

  1. 使用 LaTeX 语言对 MATLAB 中的图片进行标注
  2. 680.验证回文字符串(力扣leetcode) 博主可答疑该问题
  3. java web xml配置详解_Java Servlet web xml 配置详解
  4. java 从_java-从查询字符串中过滤参数(使用番石榴?...
  5. jenkins + maven + nexus + [ svn 或 GitLab 或 GitHub ]
  6. 出现java.lang.NoSuchMethodError错误的原因
  7. 利用redis做网站每天访问量,好处节省空间,存上一亿个用户占用12M(理论上大概)...
  8. Go语言 channel 管道 阻塞 死锁 经典问题
  9. 利用Xstream注解生成和解析xml
  10. Lotus中Form与Document的区别