【刷题】LOJ 6038 「雅礼集训 2017 Day5」远行
题目描述
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\) 之间能通过多种方式到达。
题解
直径的性质:
与一个点距离最大的点为任意一条直径的两个端点之一
两棵树之间连一条边,新树直径的两个端点一定为第一棵树直径的两个端点和第二棵树直径的两个端点这四者中之二
所以用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;
}
【刷题】LOJ 6038 「雅礼集训 2017 Day5」远行的更多相关文章
- LOJ#6038. 「雅礼集训 2017 Day5」远行(LCT)
题面 传送门 题解 要不是因为数组版的\(LCT\)跑得实在太慢我至于去学指针版的么--而且指针版的完全看不懂啊-- 首先有两个结论 1.与一个点距离最大的点为任意一条直径的两个端点之一 2.两棵树之 ...
- LOJ#6038. 「雅礼集训 2017 Day5」远行 [LCT维护子树的直径]
树的直径一定是原联通块4个里的组合 1.LCT,维护树的直径,这题就做完了 2.直接倍增,lca啥的求求距离,也可以吧- // powered by c++11 // by Isaunoya #inc ...
- loj#6038 「雅礼集训 2017 Day5」远行
分析 代码 #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define ...
- loj#6040. 「雅礼集训 2017 Day5」矩阵(线性代数+递推)
题面 传送门 题解 我的线代学得跟屎一样看题解跟看天书一样所以不要指望这题我会写题解 这里 //minamoto #include<bits/stdc++.h> #define R reg ...
- @loj - 6039@ 「雅礼集训 2017 Day5」珠宝
目录 @description@ @solution@ @accpeted code@ @details@ @description@ Miranda 准备去市里最有名的珠宝展览会,展览会有可以购买珠 ...
- [LOJ#6039].「雅礼集训 2017 Day5」珠宝[决策单调性]
题意 题目链接 分析 注意到本题的 \(C\) 很小,考虑定义一个和 \(C\) 有关的状态. 记 \(f(x,j)\) 表示考虑到了价格为 \(x\) 的物品,一共花费了 \(j\) 元的最大收益. ...
- loj #6039 「雅礼集训 2017 Day5」珠宝 分组背包 决策单调性优化
LINK:珠宝 去年在某个oj上写过这道题 当时懵懂无知wa的不省人事 终于发现这个东西原来是有决策单调性的. 可以发现是一个01背包 但是过不了 冷静分析 01背包的复杂度有下界 如果过不了说明必然 ...
- loj6038「雅礼集训 2017 Day5」远行 树的直径+并查集+LCT
题目传送门 https://loj.ac/problem/6038 题解 根据树的直径的两个性质: 距离树上一个点最远的点一定是任意一条直径的一个端点. 两个联通块的并的直径是各自的联通块的两条直径的 ...
- 【loj6038】「雅礼集训 2017 Day5」远行 树的直径+并查集+LCT
题目描述 给你 $n$ 个点,支持 $m$ 次操作,每次为以下两种:连一条边,保证连完后是一棵树/森林:询问一个点能到达的最远的点与该点的距离.强制在线. $n\le 3\times 10^5$ ,$ ...
随机推荐
- 快读板子fread
struct ios { inline char read(){ <<|; static char buf[IN_LEN],*s,*t; ,IN_LEN,stdin)),s==t?-:*s ...
- cogs2109 [NOIP2015] 运输计划
cogs2109 [NOIP2015] 运输计划 二分答案+树上差分. STO链剖巨佬们我不会(太虚伪了吧 首先二分一个答案,下界为0,上界为max{路径长度}. 然后判断一个答案是否可行,这里用到树 ...
- ln in Linux
默认情况(硬连接) ln 目标 连接名称 ll -i 显示文件的inode信息,即文件节点信息 ➜ test1 ll -i 1.txt 27987655 -rw-r--r-- 1 myuser ...
- 百度云 win10 125%界面模糊 解决
右击图标 ->兼容性->更改高DPI设置 -> 替代高DPI缩放行为.打√
- 网络流dinic模板,邻接矩阵+链式前向星
//这个是邻接矩阵的#include<iostream> #include<queue> #include<string.h> #include<stdio. ...
- intellij idea maven配置及maven项目创建
1. 下载Maven 官方地址:http://maven.apache.org/download.cgi 解压并新建一个本地仓库文件夹 2.配置maven环境变量 3.配置配置本地仓库路径 4.配置阿 ...
- XSS留言板实现
XSS 留言板实现-笔记 预备知识 XSS漏洞 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS ...
- [T-ARA][Lovey-Dovey]
歌词来源:http://music.163.com/#/song?id=22704426 作曲 : 新沙洞老虎/崔圭成 [作曲 : 新沙洞老虎/崔圭成] [作曲 : 新沙洞老虎/崔圭成] 作词 : 新 ...
- music, let's go
最近研究个新玩意,叫window.AudioContext;不懂?没关系,我也是才接触,这完全可以说个全新领域,这玩意干啥的?顾名思义,媒体上下文,也就是你媒体的数据分析,就是一串数据啊?那有啥用呢? ...
- P4语法(4)Control block
Control block Control block之中用于放置设计好的Table和Action. 可以把control block认为是pipeline的一个模板,之前用的v1model中就是in ...