BZOJ 3732 Network(小题大作之LCT)

124 篇文章 0 订阅

题目
这样今天的题单中就没有小于2KB的代码了呢。
AC Code:

#include<bits/stdc++.h>
#define maxn 45005
using namespace std;

int n,m,k;
int bl[maxn][2];

namespace LCT{
	int fa[maxn],ch[maxn][2],Max[maxn],val[maxn],rev[maxn];
	#define il inline 
	#define pa fa[x]
	il int inr(int x){ return ch[pa][1]==x; }
	il int isr(int x){ return ch[pa][1]!=x&&ch[pa][0]!=x; }
	il void dt(int x){
		if(rev[x]){
			swap(ch[x][0],ch[x][1]),rev[x]=0;
			if(ch[x][0]) rev[ch[x][0]]^=1;
			if(ch[x][1]) rev[ch[x][1]]^=1;
		}
	}
	il void dtpath(int x){ if(!isr(x)) dtpath(fa[x]); dt(x); }
	il void upd(int x){  
		Max[x] = x;
		if(val[Max[ch[x][0]]] > val[Max[x]]) Max[x] = Max[ch[x][0]];
		if(val[Max[ch[x][1]]] > val[Max[x]]) Max[x] = Max[ch[x][1]];
	}
	il void rot(int x){
		int y=fa[x],z=fa[y],c=inr(x);
		if(!isr(y)) ch[z][inr(y)]=x;
		(ch[y][c]=ch[x][!c])&&(fa[ch[y][c]]=y);
		fa[fa[ch[x][!c]=y]=x]=z;
		upd(y),upd(x);
	}
	il void splay(int x){
		for(dtpath(x);!isr(x);rot(x))
			if(!isr(pa)) rot(inr(pa)==inr(x)?pa:x);
	}
	il int access(int x,int y=0){
		for(;x;x=fa[y=x]) splay(x),ch[x][1]=y,upd(x);
		return y;
	}
	il void bert(int x){
		access(x),splay(x),rev[x]^=1;
	}
	il int sert(int x){
		access(x),splay(x);
		for(;ch[x][0];x=ch[x][0]);
		return x;
	}
	il void link(int x,int y){
		bert(x),fa[x]=y;
	}
	il void cut(int x,int y){
		bert(x),access(y),splay(y);
		fa[x]=ch[y][0]=0;
		upd(y);
	}
	il int query(int x,int y){
		bert(x),access(y),splay(y);
		return Max[y];
	}
	il void insert(int x,int y,int w){
		if(sert(x)!=sert(y)){
			val[++n]=w;
			Max[n]=n;
			link(bl[n][0]=x,n),link(n,bl[n][1]=y);
			return;
		}
		int tmp = query(x,y);
		if(val[tmp] > w){
			cut(tmp,bl[tmp][0]),cut(tmp,bl[tmp][1]);
			val[tmp] = w;
			link(tmp,bl[tmp][0]=x),link(tmp,bl[tmp][1]=y);
		}
	}
}

int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		LCT::insert(u,v,w);
	}
	for(;k--;){
		int u,v;
		scanf("%d%d",&u,&v);
		printf("%d\n",LCT::val[LCT::query(u,v)]);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值