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. VFP 的 SPT 起跳 -- 陈纯(BOE数据网络工作室)

    细节描述 Visual FoxPro 的 SPT 技术快速入门 说在前面熟悉 Fox 的朋友都知道,在 VFP 里我们可以使用远程视图 (Remote View) 和 SPT(SQL Pass Thr ...

  2. 基于python的密码字典生成器

    最近在网上看到一些作品,然后对其进行了一些完善.只是用于学习,不要去干坏事哦.程序来源于网络,我只是做了一些优化. #!/usr/bin/python# -*- coding:utf-8 -*-# @ ...

  3. css架构技巧

    1. 写一个reset.css 用于清除浏览器标签默认样式并定义全局样式,这样就不会因为浏览器默认样式出现问题,因为不同浏览器的默认样式还是不一样的

  4. 写给Unity开发者的iOS内存调试指南

    0x00 前言 工作的过程中,常常会发现有小伙伴对Unity的Profiler提供的内存数据与某些原生平台Profiler工具,例如iOS系统和Xcode,所提供的内存数据有差异而感到好奇.而且大家对 ...

  5. 7.【Spring Cloud Alibaba】微服务的用户认证与授权

    有状态 vs 无状态 有状态 那么Session在何时创建呢? 当然还是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServ ...

  6. 容器监控工具WeaveScope

    最近一段时间整了一些docker容器,弄了一些基于docker的微服务通信,弄好一套服务系统之后,对于服务的性能,基础数据的监控就显的很重要, 不然就是两眼一抹黑了,要不就是维护成本很高,这些都不符合 ...

  7. SpringBoot安全管理--(三)整合shiro

    简介: Apache Shiro 是一一个开源的轻量级的Java安全框架,它提供身份验证.授权.密码管理以及会话管理等功能. 相对于Spring Security, Shiro框架更加直观.易用,同时 ...

  8. PG数据库常用操作

    全量迁移 备份数据 $ pg_dump -h 172.19.235.145 -U <username> -d <database> > 20180704_dbpe.sql ...

  9. mybatis 测试输出SQL语句到控制台配置

    1: mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...

  10. Policy-based Approach(基于策略的方法)

    step 1:Neural Network as Actor step 2:goodness of function(训练一些Actor) 是一个序列,包含T个状态s.行为a.奖励s.代表某一次的开始 ...