正题

题目链接:https://www.luogu.com.cn/problem/P4172


题目大意

nnn个点的一张图,有两个操作

  1. 询问两个点之间的一条路径使得最长边最短
  2. 删除一条边

解题思路

显然这条边一定是在最小生成树上的,所以我们需要维护支持删边的最小生成树。

显然LCTLCTLCT无法支持删除,但是注意到只有删除操作,所以我们反着做的话就变成了加边操作,用LCTLCTLCT维护即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=2e5+10,inf=2147483647;
int n,m,t,ans[N];
int from[N],w[N],val[N];
pair<pair<int,int> ,int>lk[N];
struct node{int x,y,w,id;bool del;
}e[N];
struct Query{int op,x,y;
}q[N];
struct LCT{stack<int> s;int fa[N],t[N][2],r[N];void PushUp(int x){from[x]=x;w[x]=val[x];if(t[x][0]&&w[t[x][0]]>w[x])w[x]=w[t[x][0]],from[x]=from[t[x][0]];if(t[x][1]&&w[t[x][1]]>w[x])w[x]=w[t[x][1]],from[x]=from[t[x][1]];return;}bool Nroot(int x){return fa[x]&&(t[fa[x]][0]==x||t[fa[x]][1]==x);}bool Direct(int x){return t[fa[x]][1]==x;}void Rev(int x){swap(t[x][0],t[x][1]);r[x]^=1;}void PushDown(int x){if(r[x])Rev(t[x][0]),Rev(t[x][1]),r[x]=0;return;}void Rotate(int x){int y=fa[x],z=fa[y];int xs=Direct(x),ys=Direct(y);int w=t[x][xs^1];if(Nroot(y))t[z][ys]=x;t[x][xs^1]=y;t[y][xs]=w;if(w)fa[w]=y;fa[y]=x;fa[x]=z;PushUp(y);PushUp(x);}void Splay(int x){int now=x;s.push(x);while(Nroot(now))now=fa[now],s.push(now);while(!s.empty())PushDown(s.top()),s.pop();while(Nroot(x)){int y=fa[x];if(!Nroot(y))Rotate(x);else if(Direct(x)==Direct(y))Rotate(y),Rotate(x);else Rotate(x),Rotate(x);}return;}void Access(int x){for(int y=0;x;y=x,x=fa[x])Splay(x),t[x][1]=y,PushUp(x);return; }void MakeRoot(int x){Access(x);Splay(x);Rev(x);return;}void Split(int x,int y){MakeRoot(x);Access(y);Splay(y);return;}void Link(int x,int y){MakeRoot(x);fa[x]=y;Access(x);return;}void Cut(int x,int y){MakeRoot(x);Access(y);Splay(y);fa[t[y][0]]=0;t[y][0]=0;PushUp(y);return;}
}LCT;
struct unionfind{int fa[N];int find(int x){return (fa[x]==x)?x:(fa[x]=find(fa[x]));}void unionn(int x,int y){int Fa=find(x),Fb=find(y);if(x<y)fa[y]=x;else fa[x]=y;return;}
}F;
bool CmP(node x,node y)
{return x.w<y.w;}
bool cMp(node x,node y)
{return x.id<y.id;}
int main()
{scanf("%d%d%d",&n,&m,&t);for(int i=1;i<=m;i++){scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);if(e[i].x>e[i].y)swap(e[i].x,e[i].y);lk[i]=mp(mp(e[i].x,e[i].y),i);e[i].id=i;}sort(lk+1,lk+1+m);for(int i=1;i<=t;i++){scanf("%d%d%d",&q[i].op,&q[i].x,&q[i].y);if(q[i].x>q[i].y)swap(q[i].x,q[i].y);if(q[i].op==2){q[i].x=(*lower_bound(lk+1,lk+1+m,mp(mp(q[i].x,q[i].y),0))).second;e[q[i].x].del=1; } }for(int i=1;i<=n+m;i++)from[i]=i,val[i]=w[i]=-inf;for(int i=1;i<=n;i++)F.fa[i]=i;for(int i=1;i<=m;i++)val[i+n]=w[i+n]=e[i].w;sort(e+1,e+1+m,CmP);for(int i=1;i<=m;i++){if(e[i].del)continue;int Fa=F.find(e[i].x),Fb=F.find(e[i].y);if(Fa==Fb)continue;F.unionn(Fa,Fb);LCT.Link(e[i].x,e[i].id+n);LCT.Link(e[i].id+n,e[i].y);}sort(e+1,e+1+m,cMp);for(int i=t;i>=1;i--){if(q[i].op==1){LCT.Split(q[i].x,q[i].y);ans[i]=w[q[i].y];}else{int id=q[i].x,x,y;y=e[id].y;x=e[id].x;LCT.Split(x,y);if(w[y]>e[id].w){int w=from[y];LCT.Cut(w,e[w-n].y);LCT.Cut(e[w-n].x,w);LCT.Link(x,id+n);LCT.Link(id+n,y);}}}for(int i=1;i<=t;i++)if(q[i].op==1)printf("%d\n",ans[i]);return 0;
}

P4172-[WC2006]水管局长【LCT,最小生成树】相关推荐

  1. P4172 [WC2006]水管局长 LCT维护最小生成树

    \(\color{#0066ff}{ 题目描述 }\) SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的 ...

  2. [洛谷P4172] WC2006 水管局长

    问题描述 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水 ...

  3. P4172 [WC2006]水管局长

    题目链接 题目背景 SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦). 题目描述 每天供水公司可能要将一定量的水从 uuu 处送往 vvv 处,嘟嘟需要为供水公司 ...

  4. 洛谷.4172.[WC2006]水管局长(LCT Kruskal)

    题目链接 洛谷(COGS上也有) 不想去做加强版了..(其实处理一下矩阵就好了) 题意: 有一张图,求一条x->y的路径,使得路径上最长边尽量短并输出它的长度.会有<=5000次删边. 这 ...

  5. BZOJ_2594_[Wc2006]水管局长数据加强版_LCT

    BZOJ_2594_[Wc2006]水管局长数据加强版_LCT Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供 ...

  6. [BZOJ 2594] [Wc2006]水管局长数据加强版 【LCT】

    题目链接:BZOJ - 2594 题目分析 这道题如果没有删边的操作,那么就是 NOIP2013 货车运输,求两点之间的一条路径,使得边权最大的边的边权尽量小. 那么,这条路径就是最小生成树上这两点之 ...

  7. 沉迷Link-Cut tree无法自拔之:[BZOJ2594][Wc2006]水管局长数据加强版

    来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 这应该算是道套路题吧, 如果将图中的边转换成点, 再将边权变点权, 就可以用 \(LCT\) 来维护了 ...

  8. 水管局长数据加强版:lct,时光倒流,最小生成树,边化点

    Description: SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到 ...

  9. 【BZOJ2594】水管局长加强版,LCT+并查集+二分查找位置

    Time:2016.05.10 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: LCT维护路径最小值 倒叙处理询问,就相当于往图里面加边. 实时维护最小值,即最小生成树,可以参照魔法 ...

最新文章

  1. 【WebRTC---入门篇】(二十)WebRTC核心之SDP详解
  2. Linux开机运行应用程序
  3. url映射 路由urls.py的功能 django
  4. linux oracle dblink,Oracle 创建 DBLink 的方法
  5. tkintergui-pack布局内容1
  6. [转帖]windows+xshell+xming访问非桌面版Linux服务器
  7. canvas简易人机五子棋
  8. 数商云SCM供应链协同管理系统解决方案
  9. 教你给视频画面打马赛克
  10. CF364D Ghd
  11. 学习编程,既要仰望星空,又要脚踏实地
  12. 【统计建模与R软件】第二章 R软件的使用 上机练习4 猴子吃桃 鸡兔同笼
  13. Docer容器客户端在启动的镜像的时候报错Error invoking remote method ‘docker-start-container‘: Error: (HTTP code 500
  14. HashMap底层原理(当你put,get时内部会发生什么呢?)
  15. 同花顺镰刀三头牛指标公式源码
  16. Linux中的进程、线程和文件描述符
  17. Mathworks MATLAB for Mac (强大的商业数学软件) v9.11
  18. socket事例代码
  19. AK F.*ing leetcode 流浪计划之线段求交
  20. 基于springboot+Vue的鲜花销售商城网站

热门文章

  1. python统计出现的中文标点_Python处理中文标点符号大集合
  2. matlab画孔斯曲面,CAD CAM技术基础:第五讲 孔斯曲面
  3. java 支付宝 退款_Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)
  4. librosa能量_语音MFCC提取:librosa amp;amp; python_speech_feature(2019.12)
  5. 序列每天从0开始_序列比对(十一)——计算符号序列的全概率
  6. java的编译器怎么出来_怎样掌握ava编译器的使用,教程在这里,如何进行Java初级学习...
  7. 文件共享服务器第二部,第二章-构建Samba文件共享服务器.docx
  8. arma3自定义服务器,Arma3 生存服架设教程,武装突袭3游戏服务器架设
  9. 2019龙少php泛站群,龙少php泛站群|PHP版站群 全自动泛解析站群程序 赠送教程
  10. git push被拒绝_规范git项目提交并自动生成项目commit log