BZOJ4668 冷战(LCT维护最小生成树)
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维护最小生成树)的更多相关文章
- BZOJ2594 [Wc2006]水管局长数据加强版 【LCT维护最小生成树】
题目 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的 ...
- [BZOJ3669] [NOI2004] 魔法森林 LCT维护最小生成树
题面 一开始看到这道题虽然知道是跟LCT维护最小生成树相关的但是没有可以的去想. 感觉可以先二分一下总的精灵数,但是感觉不太好做. 又感觉可以只二分一种精灵,用最小生成树算另一种精灵,但是和似乎不单调 ...
- P4172 [WC2006]水管局长 LCT维护最小生成树
\(\color{#0066ff}{ 题目描述 }\) SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的 ...
- 洛谷2387 NOI2014魔法森林(LCT维护最小生成树)
本题是运用LCT来维护一个最小生成树. 是一个经典的套路 题目中求的是一个\(max(a_i)+max(b_i)\)尽可能小的路径. 那么这种的一个套路就是,先按照一维来排序,然后用LCT维护另一维 ...
- P2387 [NOI2014]魔法森林 LCT维护最小生成树
\(\color{#0066ff}{ 题目描述 }\) 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 ...
- bzoj 3669 lct维护最小生成树
大概题意:给一个无向图,有a,b两种边权,找一条从1到n的路径,使得max(a[i])+max(b[i])最小a[i],b[i]表示该路径上的边的对应权. 如果用类似最短路的DP来做,显然每个点的状态 ...
- 洛谷P2387 [NOI2014]魔法森林(lct维护最小生成树)
题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,…,n,边标号为 1,2,3,…, ...
- BZOJ3669(NOI2014):魔法森林 (LCT维护最小生成树)
为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节点1,隐士则住在号节点N ...
- BZOJ 2594: [Wc2006]水管局长数据加强版 (LCT维护最小生成树)
离线做,把删边转化为加边,那么如果加边的两个点不连通,直接连就行了.如果联通就找他们之间的瓶颈边,判断一下当前边是否更优,如果更优就cut掉瓶颈边,加上当前边. 那怎么维护瓶颈边呢?把边也看做点,向两 ...
随机推荐
- Python3(二) 表示‘组’的概念与定义
现实世界中总存在一组一组的事物, 一.列表的定义 type(['hello','world',1,9,True,False]) = <class 'list'> type([[1,2,3, ...
- FakeLogonScreen抓取Windows凭证
FakeLogonScreen抓取Windows凭证 实践中使用的配置 攻击者: 操作系统: Kali Linux 2020.1 IP: 192.168.1.13 目标: 作业系统: Windows ...
- Linux运维--15.OpenStack vm使用keepalived 实现负载均衡
外接mariadb集群 实现负载均衡 实验环境 10.0.1.27 galera1 10.0.1.6 galera2 10.0.1.23 galera3 10.0.1.17 harpoxy1 hapr ...
- StackExchange.Redis 之 List队列 类型示例
//从第1个开始,依次向左插入值.如果键不存在,先创建再插入值 队列形式 先进后出,后进先出 //插入后形式 <-- 10,9,8,7,6,5,4,3,2,1 <-- 方向向左依次进行 ...
- [MongoDB]mongodb的命令行操作
./mongo1.查看所有数据库show dbs2.切换数据库use 数据库名3.查询所有集合show collections4.查询所有文档db.文档名.find()db.文档名.find().pr ...
- 「Flink」事件时间与水印
我们先来以滚动时间窗口为例,来看一下窗口的几个时间参数与Flink流处理系统时间特性的关系. 获取窗口开始时间Flink源代码 获取窗口的开始时间为以下代码: org.apache.flink.str ...
- .netcore 3.1高性能微服务架构:封装调用外部服务的接口方法--HttpClient客户端思路分析
众所周知,微服务架构是由一众微服务组成,项目中调用其他微服务接口更是常见的操作.为了便于调用外部接口,我们的常用思路一般都是封装一个外部接口的客户端,使用时候直接调用相应的方法.webservice或 ...
- NB-Iot和GPRS信号通信模式的对比
NB-Iot和GPRS信号通信模式的对比
- go 算法与数据结构
数据结构 稀疏数组 package main import "fmt" /* 稀疏数组 案例:五子棋存盘与复盘 节省存储空间 */ type ValNode struct { ro ...
- 通俗易懂的RESTful API实践详解(含代码)
来源:点击进入 点击上方链接,版面更好 一.什么是RESTful REST 是面向资源的,这个概念非常重要,而资源是通过 URI 进行暴露,URI 的设计只要负责把资源通过合理方式暴露出来就可以了,对 ...