BZOJ4668 冷战(LCT维护最小生成树)

题面

自己找去

HINT

这道题就是动态加边,然后查询u,v两点最早什么时候联通,强制在线。思考一下,最早什么时候联通不就等同于维护最小生成树吗(把这条边加入的时间视为边权),然后就动态维护一下最小生成树,有个小细节,如果两点不连通,lastans要更新成0,被这个坑了

tips

出题人其实是想放带权并查集过的,所以数据范围是\(5e5\),如果把数据下载下来测是没法1s过大的点的,但是BZOJ是总时长,也就轻松AC了。

#include<bits/stdc++.h>
#define ls(x) st[x].ch[0]
#define rs(x) st[x].ch[1]
#define fa(x) st[x].f
using namespace std;
inline int read(){
int w=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
w=(w<<3)+(w<<1)+ch-48;
ch=getchar();
}
return w*f;
}
int n,m;
bool debug;
struct LINK_CUT_TREE{
struct Node{
int ch[2],f,maxx,val;
bool rev;
}st[2000010];
inline bool identify(int x){
return st[fa(x)].ch[1]==x;
}
inline void connect(int x,int fa,int son){
st[x].f=fa;st[fa].ch[son]=x;return;
}
inline void pushup(int x){
st[x].maxx=max(st[ls(x)].maxx,st[rs(x)].maxx);
st[x].maxx=max(st[x].maxx,st[x].val);return;
}
inline void pushrev(int x){
st[x].rev^=1;swap(ls(x),rs(x));return;
}
inline void pushdown(int x){
if(st[x].rev){
st[x].rev=0;
if(ls(x))pushrev(ls(x));
if(rs(x))pushrev(rs(x));
}
}
inline bool isroot(int x){
return st[fa(x)].ch[0]!=x&&st[fa(x)].ch[1]!=x;
}
inline void rotate(int x){
int y=st[x].f;int z=st[y].f;int yson=identify(x);int zson=identify(y);
int b=st[x].ch[yson^1];st[x].f=z;
if(!isroot(y))connect(x,z,zson);
connect(b,y,yson);connect(y,x,yson^1);
pushup(y);pushup(x);return;
}
int sta[500010];
inline void splay(int x){
int y=x;int top=0;
sta[++top]=y;
while(!isroot(y))sta[++top]=y=fa(y);
while(top)pushdown(sta[top--]);
while(!isroot(x)){
int y=st[x].f;
if(!isroot(y)){
if(identify(x)==identify(y)) rotate(x);
else rotate(y);
}
rotate(x);
}
}
inline void access(int x){
int y=0;
while(x){
splay(x);rs(x)=y;pushup(x);y=x;x=fa(x);
}
}
inline void makeroot(int x){
access(x);splay(x);pushrev(x);return;
}
inline int findroot(int x){
access(x);splay(x);
while(ls(x)){
pushdown(x);x=ls(x);
}
return x;
}
inline void split(int x,int y){
makeroot(x);access(y);splay(y);return;
}
inline void link(int x,int y){
makeroot(x);fa(x)=y;
}
inline void cut(int x,int y){
makeroot(x);
if(findroot(y)!=x||fa(x)!=y) return;
ls(y)=fa(x)=0;pushup(x);pushup(y);return;
}
}LCT;
int main(){
n=read();m=read();int ans=0;int cur=0;
//debug=true;
for(int i=1;i<=m;i++){
int opt=read();int x=read();int y=read();
x=x^ans;y=y^ans;
if(debug){
cout<<"test:"<<x<<" "<<y<<endl;
}
if(opt==0){
cur++;if(LCT.findroot(x)==LCT.findroot(y)) continue;
LCT.st[i+n].val=cur;LCT.link(x,i+n);LCT.link(i+n,y);
}
else{
if(LCT.findroot(x)!=LCT.findroot(y)){
ans=0;puts("0");continue;
}
LCT.split(x,y);ans=LCT.st[y].maxx;printf("%d\n",ans);
}
}
return 0;
}

BZOJ4668 冷战(LCT维护最小生成树)的更多相关文章

  1. BZOJ2594 [Wc2006]水管局长数据加强版 【LCT维护最小生成树】

    题目 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的 ...

  2. [BZOJ3669] [NOI2004] 魔法森林 LCT维护最小生成树

    题面 一开始看到这道题虽然知道是跟LCT维护最小生成树相关的但是没有可以的去想. 感觉可以先二分一下总的精灵数,但是感觉不太好做. 又感觉可以只二分一种精灵,用最小生成树算另一种精灵,但是和似乎不单调 ...

  3. P4172 [WC2006]水管局长 LCT维护最小生成树

    \(\color{#0066ff}{ 题目描述 }\) SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的 ...

  4. 洛谷2387 NOI2014魔法森林(LCT维护最小生成树)

    本题是运用LCT来维护一个最小生成树. 是一个经典的套路 题目中求的是一个\(max(a_i)+max(b_i)\)尽可能小的路径. 那么这种的一个套路就是,先按照一维来排序,然后用LCT维护另一维 ...

  5. P2387 [NOI2014]魔法森林 LCT维护最小生成树

    \(\color{#0066ff}{ 题目描述 }\) 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 ...

  6. bzoj 3669 lct维护最小生成树

    大概题意:给一个无向图,有a,b两种边权,找一条从1到n的路径,使得max(a[i])+max(b[i])最小a[i],b[i]表示该路径上的边的对应权. 如果用类似最短路的DP来做,显然每个点的状态 ...

  7. 洛谷P2387 [NOI2014]魔法森林(lct维护最小生成树)

    题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,…,n,边标号为 1,2,3,…, ...

  8. BZOJ3669(NOI2014):魔法森林 (LCT维护最小生成树)

    为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节点1,隐士则住在号节点N ...

  9. BZOJ 2594: [Wc2006]水管局长数据加强版 (LCT维护最小生成树)

    离线做,把删边转化为加边,那么如果加边的两个点不连通,直接连就行了.如果联通就找他们之间的瓶颈边,判断一下当前边是否更优,如果更优就cut掉瓶颈边,加上当前边. 那怎么维护瓶颈边呢?把边也看做点,向两 ...

随机推荐

  1. [转]java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?

    在 Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity. 所有对象的非同步 方法都能够在任意时刻被任意线 ...

  2. pytorch之 CNN

    # library # standard library import os # third-party library import torch import torch.nn as nn impo ...

  3. 面试官:你说你熟悉jvm?那你讲一下并发的可达性分析

    这是why技术的第35篇原创文章 上面这张图是我还是北漂的时候,在鼓楼附近的胡同里面拍的. 那天刚刚下完雨,路过这个地方的时候,一瞬间就被这五颜六色的门板和自行车给吸引了,于是拍下了这张图片.看到这张 ...

  4. 修改kali软件源并配置网络

    一.配置kali使用xshell连接 查看ssh服务状态 # service ssh status 开启ssh服务 # service ssh start 修改ssh配置文件 # vi /etc/ss ...

  5. vertical-align和line-height的理解及实例

    line-height 字符实际大小和font-size的关系: 下图中不同字体font-size都是100px 测量了一下每个 span 的高度:Helvetica 115px,Gruppo 97p ...

  6. Python性能优化方案

    Python性能优化方案 从编码方面入手,代码算法优化,如多重条件判断有限判断先决条件(可看 <改进python的91个建议>) 使用Cython (核心算法, 对性能要求较大的建议使用C ...

  7. JS实现斐波那契数列的几种方法

    斐波那契数列指的是这样一个数列:1.1.2.3.5.8.13.21.34.…… 前两项为1,从第三项起,每一项等于前两项的和,即F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n& ...

  8. 深浅COPY浅谈

    通俗地谈一下深浅COPY的区别,顺便做个笔记.(纯手打,如有不对之处还望大牛指导改正.) 个人觉得区分这个概念需要从数据类型来切入: 1.如果“被复制对象”(后面简称“原对象”)的数据类型为不可变数据 ...

  9. Uncaught TypeError: Cannot set property 'onclick' of null解决办法

    如果把js内容直接放在这个head标签以内,button按钮不能正常点击更换body的背景颜色,报错提示:demo6.html:16 Uncaught TypeError: Cannot set pr ...

  10. C#实现的一些常见时间格式

    string aa = DateTime.Now.ToShortDateString();//"2019/9/23" string bb = DateTime.Now.ToShor ...