[WC2006] 水管局长 题解
最大值最小的路径肯定在最小生成树上,考虑用 \(LCT\) 维护最小生成树,只需要维护长度最长的边即可实现。由于 \(LCT\) 维护最小生成树不支持删边,所以采用倒序加边的方式处理。
时间复杂度 \(O(n\log n)\)。
#include<bits/stdc++.h>
#define fa(x) lct[x].fa
#define fl(x) lct[x].fl
#define id(x) lct[x].id
#define sn(x,i) lct[x].sn[i]
using namespace std;
const int N=1e5+5,M=1e6+N;
struct node{
int sn[2],fa,fl,id;
}lct[M];int n,m,q,st[M],u[M],v[M],w[M];
int tp,mp[M],qo[N],qx[N],qy[N],ans[N];
unordered_map<int,int>ma[N];
int check(int x){
return sn(fa(x),0)!=x&&sn(fa(x),1)!=x;
}int chksn(int x){
return sn(fa(x),1)==x;
}void push_up(int x){
id(x)=id(sn(x,(w[id(sn(x,0))]<w[id(sn(x,1))])));
if(w[x]>w[id(x)]) id(x)=x;
}void push_down(int x){
if(!x||!fl(x)) return;
fl(sn(x,0))^=1,fl(sn(x,1))^=1;
swap(sn(x,0),sn(x,1)),fl(x)=0;
}void rotate(int x){
int y=fa(x),z=fa(y),k=chksn(x);
if(!check(y))
sn(z,chksn(y))=x;
fa(x)=z,fa(y)=x,fa(sn(x,1-k))=y;
sn(y,k)=sn(x,1-k),sn(x,1-k)=y;
push_up(y);
}void splay(int x){
st[tp=1]=x;
for(int i=x;!check(i);i=fa(i)) st[++tp]=fa(i);
while(tp) push_down(st[tp--]);
while(!check(x)){
int y=fa(x),z=fa(y);
if(!check(y))
rotate(chksn(x)!=chksn(y)?x:y);
rotate(x);
}push_up(x);
}void access(int x){
for(int i=0;x;i=x,x=fa(x))
splay(x),sn(x,1)=i,push_up(x);
}void mk(int x){
access(x),splay(x),fl(x)^=1;
}void split(int x,int y){
mk(x),access(y),splay(y);
}void cut(int x,int y){
split(x,y),sn(y,0)=fa(x)=0;
}void link(int x,int y){
mk(x),access(y),fa(x)=y;
}int find(int x){
access(x),splay(x);
while(sn(x,0)) x=sn(x,0);
return x;
}void add(int x){
if(find(u[x]+m)!=find(v[x]+m))
return link(u[x]+m,x),link(x,v[x]+m);
split(u[x]+m,v[x]+m);int idx=id(v[x]+m);
if(w[idx]<=w[x]) return;
cut(u[idx]+m,idx),cut(idx,v[idx]+m);
link(u[x]+m,x),link(x,v[x]+m);
}int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m>>q;
for(int i=1;i<=m;i++){
cin>>u[i]>>v[i]>>w[i];
ma[u[i]][v[i]]=ma[v[i]][u[i]]=i;
}for(int i=1;i<=q;i++){
cin>>qo[i]>>qx[i]>>qy[i];
if(qo[i]==2) mp[ma[qx[i]][qy[i]]]=1;
}for(int i=1;i<=m;i++) if(!mp[i]) add(i);
for(int i=q;i;i--){
if(qo[i]==1){
split(qx[i]+m,qy[i]+m);
ans[i]=w[id(qy[i]+m)];
}else add(ma[qx[i]][qy[i]]);
}for(int i=1;i<=q;i++)
if(ans[i]) cout<<ans[i]<<"\n";
return 0;
}
[WC2006] 水管局长 题解的更多相关文章
- BZOJ2594: [Wc2006]水管局长数据加强版
题解: 裸LCT+离线+二分+MST... 代码:(几乎摘抄自hzwer) #include<cstdio> #include<cstdlib> #include<cma ...
- P4172 [WC2006]水管局长
P4172 [WC2006]水管局长 前言 luogu数据太小 去bzoj,他的数据大一些 思路 正着删不好维护 那就倒着加,没了 LCT维护他的最小生成树MST 树上加一条边肯定会有一个环 看看环上 ...
- bzoj 2594: [Wc2006]水管局长数据加强版 动态树
2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 934 Solved: 291[Submit][Sta ...
- BZOJ 2594: [Wc2006]水管局长数据加强版( LCT )
离线然后就是维护加边的动态MST, Link cut tree秒掉..不过我写+调了好久...时间复杂度O(NlogN + MlogM) ------------------------------- ...
- [bzoj2594][Wc2006]水管局长数据加强版 (lct)
论蒟蒻的自我修养T_T.. 和noi2014魔法森林基本一样...然而数据范围大得sxbk...UPD:这题如果用lct判联通的话可能会被卡到O(mlogm)..所以最好还是用并查集吧 一开始数组开太 ...
- BZOJ 2594: [Wc2006]水管局长数据加强版 [LCT kruskal]
2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 2917 Solved: 918[Submit][St ...
- BZOJ_2594_[Wc2006]水管局长数据加强版_LCT
BZOJ_2594_[Wc2006]水管局长数据加强版_LCT Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供 ...
- P4172 [WC2006]水管局长(LCT)
P4172 [WC2006]水管局长 LCT维护最小生成树,边权化点权.类似 P2387 [NOI2014]魔法森林(LCT) 离线存储询问,倒序处理,删边改加边. #include<iostr ...
- [BZOJ2594][WC2006]水管局长加强版(LCT+Kruskal)
2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 4452 Solved: 1385[Submit][S ...
- [BZOJ2594] [WC2006]水管局长(Kruskal+LCT)
[BZOJ2594] [WC2006]水管局长(Kruskal+LCT) 题面 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可 ...
随机推荐
- C#委托的前世今生
一.前言 大家好!我是付工. 十年前,刚开始学C#编程的时候,被委托困扰了很久. 今天跟大家分享一下关于委托的那些事儿. 二.委托原理 什么是委托? 抛开编程,委托是一个汉语词语,指的是把事情托付给别 ...
- dfm格式初解之TTreeView
TTreeView 的 Items.NodeData 值解析: Items.NodeData = { 0302000000200000000000000000000000FFFFFFFFFFFFFFF ...
- cookie session token 发展史(便于理解jwt)
目录 一.cookie session token 发展史(彻底理解cookie,session,token,便于理解jwt) 1.Cookie,Session,Token发展史 2.Cookie,S ...
- Netty有关
https://www.baeldung.com/tag/netty/ https://github.com/eugenp/tutorials https://stackoverflow.com/qu ...
- Mockito入门:如何在Spring中Mock部分对象
前情提要 随着分布式应用的开发逐渐成为标配,多个微服务团队合作来完成垂直业务的开发成为了一种常态.微服务使得团队可以专注于自己的业务逻辑,在和下游依赖和上游对接的团队聚焦好接口之后,就进入正式的开发. ...
- Qt编写地图综合应用60-覆盖物坐标和搜索
一.前言 地图应用中有时候需要开启悬浮工具栏,用户可以直接在地图上绘制矩形.多边形.圆形.线条等,于是需要提供一个函数接口,能够获取到用户绘制的这些图形形状对应的信息.比如坐标点.圆形的中心点和半径. ...
- [转]奇异值分解(SVD)方法求解最小二乘问题的原理
原文链接:奇异值分解(SVD)方法求解最小二乘问题的原理 翻译 搜索 复制
- 贝叶斯定律和卡尔曼滤波中,关于(e^-x)*(e^-x)的积分的计算方法
贝叶斯定律和卡尔曼滤波中,关于(e^-x)*(e^-x)的积分的计算方法: 1.用数学软件Mathmatica计算: 2.用复变函数中的留数定理计算: 3.用FFT+卷积公式计算.
- IM扫码登录技术专题(四):你真的了解二维码吗?刨根问底、一文掌握!
本文引用了ELab团队.腾讯大讲堂两个公众号分享的文章内容,引用内容见文末参考资料,感谢原作者的无私分享. 1.引言 对于市面上主流的IM来说,跟二维码有关的功能,比如扫码加好友.扫码登陆.扫码加群等 ...
- 意外之喜——黑夜 CrossFire!!!
在日常逛L站时,偶然发现了"友链"功能,机缘巧合下进入了specialhua的博客,又被吸引着点进了其中一篇博客,于是便通过specialhua的博客看到了黑夜的这篇文章,感觉就像 ...