[2018.07.21 T2] 离家出走
暂无链接
离家出走
【问题描述】
**横看成岭侧成峰,远近高低各不同。 **
企鹅豆豆考试爆零了,心态爆炸的他准备离家出走。
贫穷的企鹅国有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] 离家出走相关推荐
- 【跃迁之路】【531天】程序员高效学习方法论探索系列(实验阶段288-2018.07.21)...
@(跃迁之路)专栏 [跃迁之路]奖励金计划正式开始 从2018.7.1起,[跃迁之路]奖励金计划正式起航,从今以后,每月1日,我会将自己个人上月收入的1%计入[跃迁之路]奖励金池,积累到足够金额后,将 ...
- 2018.07.19 仿优酷网页小项目
时间:2018.07.19 大一下学期暑假 地点:成都-实习 项目类型:HTML+CSS仿优酷网页 制作时间:两天 网页源码: <!doctype html> <html> & ...
- RedHat6.5虚拟机架设Redis和Kafka伪集群(2018.8.21最新重要补充!)
架设Redis: 虚拟机架设,桥接模式下要保证实体机能上网,这样虚拟机才会分配到一个ip(这里是192.168.43.105),方便下面的集群配置每个节点ip,伪集群都设置成一个, 但要保证这个ip网 ...
- 2018.01.21.一周机器学习周记
时间:2018.01.21.一周 主要内容 1.整理前期关于决策树的一个小型实践项目文档(实践进行中) 2.搭建TensorFlow环境(进行中) 3.拓展:实践Python的自动化模块pyautog ...
- 2018.07.30 巴别时代
* 项目部署更新 用符号链接 project => project1, project2 ln -s project2 project * composer自动加载机制 namespace =& ...
- Microsoft Artificial Intelligence Conference(2018.05.21)
时间:2018.05.21 地点:北京嘉丽大酒店 转载于:https://www.cnblogs.com/xuefeng1982/p/10335943.html
- 【跃迁之路】【440天】刻意练习系列199(2018.04.21)
@(跃迁之路)专栏 叨叨两句 技术的精进不能只是简单的刷题,而应该是不断的"刻意"练习 该系列改版后正式纳入[跃迁之路]专栏,持续更新 一.SQL [跃迁之路]Java基础--SQ ...
- 暑期训练日志----2018.8.21
训练第23天. 上午开始的状压DP,一开始看的迷迷糊糊的,翻了大量的资料看了一上午算是入门了,但要写还是写不出来. 下午组队打比赛,刚开始服务器又崩了,心态爆炸...一个巨水的题写半天没写出来,全队磨 ...
- vue-cli脚手架npm run build打包后图片路径问题 2018.11.21
2018/11/21 最近在自己尝试做一个vue的项目,发现了一个打包以后出现的路径问题 使用npm run dev 可以正常打开项目,图片路径不会出错,使用脚手架npm run build 打包以后 ...
- 服务器离家出走怎么修复,减肥减到“大姨妈”离家出走?教你几招把它找回来!...
原标题:减肥减到"大姨妈"离家出走?教你几招把它找回来! 大家好,我是九姑娘. 九真的经常会在后台收到关于"大姨妈"的问题: 你说这位"亲戚" ...
最新文章
- Science长文综述:通过空间斑图形成避免复杂系统崩溃
- 静态网页制作html语言入门
- Netflix:通过可视化和统计学改进用户QoE
- sqlserver55555_sqlserver把小数点后面多余的0去掉
- 预编译对象解决SQL注入问题
- 【JAVA 第三章 流程控制语句】课后习题 月历打印
- 写了一个验证数字范围的正则表达式
- 拷贝linux系统镜像
- 处理机调度之时间片轮转调度算法实现
- 黑群晖DSM7.1.0物理机安装教程
- Android 8.1 Launcher3实现动态指针时钟
- 用python来做一个APP | python GUI 基础(实战)
- 我们的地盘,我们做主
- 全文 40000 字,最强(全) Matplotlib 实操指南
- 2018年中考计算机考试成绩,2018年中考分数线
- 多任务学习(Multi-task Learning)方法总结
- 计算机毕业设计(论文+代码+数据库+查重)
- 大四实习两个月的体会
- 博士申请 | 香港大学倪卓娴教授招收机器学习和智慧物联网方向全奖博士生
- Linux命令查看子进程命令,Linux基础命令——查看进程命令
热门文章
- 使用 LaTeX 语言对 MATLAB 中的图片进行标注
- 680.验证回文字符串(力扣leetcode) 博主可答疑该问题
- java web xml配置详解_Java Servlet web xml 配置详解
- java 从_java-从查询字符串中过滤参数(使用番石榴?...
- jenkins + maven + nexus + [ svn 或 GitLab 或 GitHub ]
- 出现java.lang.NoSuchMethodError错误的原因
- 利用redis做网站每天访问量,好处节省空间,存上一亿个用户占用12M(理论上大概)...
- Go语言 channel 管道 阻塞 死锁 经典问题
- 利用Xstream注解生成和解析xml
- Lotus中Form与Document的区别