题目描述

Miranda 生活的城市有 \(N\) 个小镇,一开始小镇间没有任何道路连接。随着经济发现,小镇之间陆续建起了一些双向的道路但是由于经济不太发达,在建设过程中,会保证对于任意两个小镇,最多有一条路径能互相到达。有的时候 Miranda 会从某个小镇开始进行徒步旅行,每次出发前,她都想选择一个她能到达的最远的小镇作为终点,并且她在行走过程中是不会走回头路的,为了估算这次旅行的时间,她会需要你告诉她这次旅行的时间会是多少呢?可以假设通过每条道路都需要单位时间,并且 Miranda 不会在小镇停留。

输入格式

第一行一个整数 \(\text{type}\),表示数据类型。

第二行两个整数 \(N\)、\(Q\) 。

接下来 \(Q\) 行,每行先读入一个整数 \(t\) ,若 \(t = 1\) ,则接下来读入两个整数 \(u\) 、\(v\) ,表示小镇 \(u\) 与小镇 \(v\) 建立了一条新道路。若 \(t = 2\) ,读入一个整数 \(u\) ,表示 Miranda 要开始一次从小镇 \(u\) 出发的旅行。

  • 若 \(\text{type} = 1\) ,记 \(\text{lastAns}\) 表示最近一次 Miranda 旅行的时间,那么对于每次操作的 \(u\) 或 \(u, v\) ,都要异或上 \(\text{lastAns}\) 。

  • 若 \(\text{type} = 0\) ,则不需要对数据进行处理。

输出格式

对于每次询问,输出 Miranda 能到达的最远的小镇的距离是多少。注意 Miranda 可能只能留在开始的小镇。

样例

样例输入

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
1
0
3
2
3

数据范围与提示

对于 \(20\%\) 的数据,\(N \leq 5000, Q \leq 10000\) ;

对于 \(50\%\) 的数据,\(N \leq 100000, Q \leq 200000\) ;

对于另外 \(20\%\) 的数据,\(\text{type} = 0\) ;

对于 \(100\%\) 的数据,\(N \leq 300000, Q \leq 500000, \text{type} \in \{ 0, 1 \}\) ,解密后的 \(u\) 、\(v\) 满足 \(1 \leq u, v \leq N\) ,且道路的修建会满足:每一时刻,都不存在 \(u, v\) 使得 \(u, v\) 之间能通过多种方式到达。

题解

直径的性质:

  1. 与一个点距离最大的点为任意一条直径的两个端点之一

  2. 两棵树之间连一条边,新树直径的两个端点一定为第一棵树直径的两个端点和第二棵树直径的两个端点这四者中之二

所以用LCT维护联通块直径的两个端点

查询时,把查询的点与两个端点分别split再询问size大小,取max即为答案

修改时,取出两个合并的联通块的直径的端点,四个,讨论6种情况,取距离最大的两个点为新的直径的端点

就这样就做完了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=300000+10;
int n,q,res,p1,p2,fa[MAXN],type,lastans;
std::pair<int,int> d[MAXN];
#define lc(x) ch[(x)][0]
#define rc(x) ch[(x)][1]
struct LinkCut_Tree{int size[MAXN],ch[MAXN][2],fa[MAXN],rev[MAXN],stack[MAXN],cnt;inline bool nroot(int x){return lc(fa[x])==x||rc(fa[x])==x;}inline void reverse(int x){std::swap(lc(x),rc(x));rev[x]^=1;}inline void pushup(int x){size[x]=size[lc(x)]+size[rc(x)]+1;}inline void pushdown(int x){if(rev[x]){if(lc(x))reverse(lc(x));if(rc(x))reverse(rc(x));rev[x]=0;}}inline void rotate(int x){int f=fa[x],p=fa[f],c=(rc(f)==x);if(nroot(f))ch[p][rc(p)==f]=x;fa[ch[f][c]=ch[x][c^1]]=f;fa[ch[x][c^1]=f]=x;fa[x]=p;pushup(f);pushup(x);}inline void splay(int x){cnt=0;stack[++cnt]=x;for(register int i=x;nroot(i);i=fa[i])stack[++cnt]=fa[i];while(cnt)pushdown(stack[cnt--]);for(register int y=fa[x];nroot(x);rotate(x),y=fa[x])if(nroot(y))rotate((lc(fa[y])==y)==(lc(y)==x)?y:x);pushup(x);}inline void access(int x){for(register int y=0;x;x=fa[y=x])splay(x),rc(x)=y,pushup(x);}inline void makeroot(int x){access(x);splay(x);reverse(x);}inline void split(int x,int y){makeroot(x);access(y);splay(y);}inline void link(int x,int y){makeroot(x);fa[x]=y;pushup(y);}
};
LinkCut_Tree T;
#undef lc
#undef rc
template<typename T> inline void read(T &x)
{T data=0,w=1;char ch=0;while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();if(ch=='-')w=-1,ch=getchar();while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline int found(int x)
{if(fa[x]!=x)fa[x]=found(fa[x]);return fa[x];
}
inline void length(int x,int y)
{T.split(x,y);if(T.size[y]>res)res=T.size[y],p1=x,p2=y;
}
#define ft first
#define sd second
inline void modify(int x,int y)
{std::pair<int,int> a=d[found(x)],b=d[found(y)];res=0;T.link(x,y);length(a.ft,a.sd);length(a.ft,b.ft);length(a.ft,b.sd);length(a.sd,b.ft);length(a.sd,b.sd);length(b.ft,b.sd);d[found(y)]=std::make_pair(p1,p2);fa[found(x)]=found(y);
}
#undef ft
#undef sd
int main()
{read(type);read(n);read(q);for(register int i=1;i<=n;++i)fa[i]=i,d[i]=std::make_pair(i,i);while(q--){int opt;read(opt);if(opt==1){int u,v;read(u);read(v);if(type)u^=lastans,v^=lastans;modify(u,v);}if(opt==2){int u,ans=0;read(u);if(type)u^=lastans;std::pair<int,int> now=d[found(u)];T.split(now.first,u);chkmax(ans,T.size[u]);T.split(now.second,u);chkmax(ans,T.size[u]);write(lastans=ans-1,'\n');}}return 0;
}

转载于:https://www.cnblogs.com/hongyj/p/9260455.html

【刷题】LOJ 6038 「雅礼集训 2017 Day5」远行相关推荐

  1. loj 6038「雅礼集训 2017 Day5」远行

    http://www.elijahqi.win/archives/3236 题目描述 Miranda 生活的城市有 N NN 个小镇,一开始小镇间没有任何道路连接.随着经济发现,小镇之间陆续建起了一些 ...

  2. [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)

    [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相 description solution 一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心(满足最重的儿 ...

  3. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 -- 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

  4. 【思维题 细节】loj#6042. 「雅礼集训 2017 Day7」跳蚤王国的宰相

    挂于±1的细节-- 题目描述 跳蚤王国爆发了一场动乱,国王在镇压动乱的同时,需要在跳蚤国地方钦定一个人来做宰相. 由于当时形势的复杂性,很多跳蚤都并不想去做一个傀儡宰相,带着宰相的帽子,最后还冒着被打 ...

  5. LOJ#6044. 「雅礼集训 2017 Day8」共(Prufer序列)

    题面 传送门 题解 答案就是\(S(n-k,k)\times {n-1\choose k-1}\) 其中\(S(n,m)\)表示左边\(n\)个点,右边\(m\)个点的完全二分图的生成树个数,它的值为 ...

  6. LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)

    题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...

  7. LOJ #6052. 「雅礼集训 2017 Day11」DIV

    完了我是数学姿势越来越弱了,感觉这种CXRdalao秒掉的题我都要做好久 一些前置推导 首先我们很容易得出\((a+bi)(c+di)=k \Leftrightarrow ac-bd=k,ad+bc= ...

  8. LOJ #6051. 「雅礼集训 2017 Day11」PATH

    完了感觉最近留了好多坑的说,这题也是模模糊糊地会一点 首先我们发现题目要求的是单调不上升的序列个数,那么一个套路就是用值减去下标 然后考虑连续位置的限制,这个我们做一个置换然后尽量向后取 这样拿值和位 ...

  9. Loj 6036 「雅礼集训 2017 Day4」编码 - 2-sat

    题目传送门 唯一的传送门 题目大意 给定$n$个串,每个串只包含 '0','1','?' ,其中 '?' 至多在每个串中出现1次,它可以被替换为 '0' 或 '1' .问是否可能任意两个不同的串不满足 ...

最新文章

  1. SQLSERVER中统计所有表的记录数
  2. 处理视频小工具 -- ffmpeg
  3. boosting_bagging
  4. 选型OpenStack,需要谨防“舍本逐末”
  5. [doc文档]widows apache+myql+php
  6. Ubuntu16.04安装显卡驱动错误及解决方案
  7. 简述tcp协议的可靠性有哪些机制_腾讯面试HTTP与TCP/IP20连问,你能答出多少?
  8. python email模块详解_Python使用email模块对邮件进行编码和解码的实例教程
  9. mysql仓库管理软件破解版_Max(TM)仓库管理软件|Max(TM)仓库管理系统下载_v2.0.5.1 MySQL网络版_9号软件下载...
  10. STM32单片机最小系统
  11. 台式计算机有线无线网卡设置,电脑无线网卡如何使用 电脑外置无线网卡详细使用图文教程...
  12. java不使用科学计数法_java不用科学计数法
  13. 显示器的分辨率,字体像素
  14. 【转】DotNetNuke常用扩展模块
  15. MySQL-Parser
  16. Educoder/头歌JAVA——jQuery动画
  17. eNSP第二篇:Eth-trunk,链路聚合,常用命令,二层链路聚合和三层链路聚合
  18. PDF格式的文档如何编辑修改
  19. 计算机毕业设计ssm课堂考勤管理系统t6x5x系统+程序+源码+lw+远程部署
  20. js通过AJAX绑定数据四部曲

热门文章

  1. Python 实现十大经典排序算法
  2. UI自动化测试+selenium环境安装配置
  3. 神武3 服务器维护公告,《神武4》本周重点维护内容 游戏更新公告
  4. [附源码]计算机毕业设计Python+uniapp一款基于安卓的小叮当音乐软件dpk40(程序+lw+APP+远程部署)
  5. 浅谈支撑起支付宝整个“11-11”的幕后功臣OceanBase数据库
  6. c语言最大值和最小值1157,基于NBU OJ的C语言在线实验及习题汇编(计算机科学与技术21世纪高等学校规划教材)...
  7. 关于在IDEA新建中无法找到VUE组件的问题
  8. 随想005:调试的思考
  9. python读取csv最后一行_Python pandas Dataframe来自csv的第一行和最后一行
  10. 中兴通讯:控股股东拟以持有的本公司股份参与认购基金份额