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. linux shell 操作 mysql命令(不进入mysql操作界面)

    由于需要,需要将一系列mysql的操作制作成.sh文件,只需要shell操作bash命令就可以傻瓜式的完成黑盒任务. #!/bin/bash mysql -uroot -p??? -e "c ...

  2. XAMPP与ISS在80端口冲突问题

    1.在control界面上通过apach行的config,选择httpd.conf,将其中的listen和ServerName localhost:后面的80改为8080. 2.打开control最右 ...

  3. ansible hosts配置

    编辑/etc/ansible/hosts 添加本机的public SSH key到目标机器的authorized_keys   #ssh-copy-id 添加本机的私钥到Ansible 运行ansib ...

  4. Head First设计模式——代理模式

    在HeadFirst设计模式中代理模式用了比较多的篇幅来讲解,其中的例子我感觉有些繁琐,所以我们这篇就不按照惯例用例子来阐述代理模式了.我们直接进入正题,分析模式本身的设计和解决的问题. 远程代理模式 ...

  5. phpstrom laravel代码自动提示

    1.安装composer包 composer require barryvdh/laravel-ide-helper dev-master 2.目录:\config\app.php 的'provide ...

  6. scanf函数中*修饰符的作用,如:%*d

    在scanf函数中,*修饰符可以跳过所在项的输入.如下: #include <stdio.h> int main() { ; printf("请输入:"); scanf ...

  7. 多线程笔记 - provider-consumer

    通过多线程实现一个简单的生产者-消费者案例(笔记). 首先定义一个要生产消费的数据类 : public class Data { private String id; private String n ...

  8. Hadoop之HDFS扩容方法

    HDFS就是用来存取数据的,那么当数据太多的时候存不下,我们必需扩充硬盘容量,或者换个更大的硬盘. 由于它是分布式文件系统,有两种扩充HDFS集群容量的方法:横向扩容和纵向扩容 横向扩容 横向扩容就是 ...

  9. 消息队列 ActiveMQ的简单了解以及点对点与发布订阅的方法实现ActiveMQ

    Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件: 由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行. Act ...

  10. Auto-Encoder(自编码器)原理

    1.无监督学习 无监督学习和监督学习是机器学习的两个方向,监督学习主要适用于已经标注好的数据集(如mnist分类问题),无监督学习则是希望计算机完成复杂的标注任务,简单的解释就是——教机器自己学习,它 ...