最大值最小的路径肯定在最小生成树上,考虑用 \(LCT\) 维护最小生成树,只需要维护长度最长的边即可实现。由于 \(LCT\) 维护最小生成树不支持删边,所以采用倒序加边的方式处理。

时间复杂度 \(O(n\log n)\)。

  1. #include<bits/stdc++.h>
  2. #define fa(x) lct[x].fa
  3. #define fl(x) lct[x].fl
  4. #define id(x) lct[x].id
  5. #define sn(x,i) lct[x].sn[i]
  6. using namespace std;
  7. const int N=1e5+5,M=1e6+N;
  8. struct node{
  9. int sn[2],fa,fl,id;
  10. }lct[M];int n,m,q,st[M],u[M],v[M],w[M];
  11. int tp,mp[M],qo[N],qx[N],qy[N],ans[N];
  12. unordered_map<int,int>ma[N];
  13. int check(int x){
  14. return sn(fa(x),0)!=x&&sn(fa(x),1)!=x;
  15. }int chksn(int x){
  16. return sn(fa(x),1)==x;
  17. }void push_up(int x){
  18. id(x)=id(sn(x,(w[id(sn(x,0))]<w[id(sn(x,1))])));
  19. if(w[x]>w[id(x)]) id(x)=x;
  20. }void push_down(int x){
  21. if(!x||!fl(x)) return;
  22. fl(sn(x,0))^=1,fl(sn(x,1))^=1;
  23. swap(sn(x,0),sn(x,1)),fl(x)=0;
  24. }void rotate(int x){
  25. int y=fa(x),z=fa(y),k=chksn(x);
  26. if(!check(y))
  27. sn(z,chksn(y))=x;
  28. fa(x)=z,fa(y)=x,fa(sn(x,1-k))=y;
  29. sn(y,k)=sn(x,1-k),sn(x,1-k)=y;
  30. push_up(y);
  31. }void splay(int x){
  32. st[tp=1]=x;
  33. for(int i=x;!check(i);i=fa(i)) st[++tp]=fa(i);
  34. while(tp) push_down(st[tp--]);
  35. while(!check(x)){
  36. int y=fa(x),z=fa(y);
  37. if(!check(y))
  38. rotate(chksn(x)!=chksn(y)?x:y);
  39. rotate(x);
  40. }push_up(x);
  41. }void access(int x){
  42. for(int i=0;x;i=x,x=fa(x))
  43. splay(x),sn(x,1)=i,push_up(x);
  44. }void mk(int x){
  45. access(x),splay(x),fl(x)^=1;
  46. }void split(int x,int y){
  47. mk(x),access(y),splay(y);
  48. }void cut(int x,int y){
  49. split(x,y),sn(y,0)=fa(x)=0;
  50. }void link(int x,int y){
  51. mk(x),access(y),fa(x)=y;
  52. }int find(int x){
  53. access(x),splay(x);
  54. while(sn(x,0)) x=sn(x,0);
  55. return x;
  56. }void add(int x){
  57. if(find(u[x]+m)!=find(v[x]+m))
  58. return link(u[x]+m,x),link(x,v[x]+m);
  59. split(u[x]+m,v[x]+m);int idx=id(v[x]+m);
  60. if(w[idx]<=w[x]) return;
  61. cut(u[idx]+m,idx),cut(idx,v[idx]+m);
  62. link(u[x]+m,x),link(x,v[x]+m);
  63. }int main(){
  64. ios::sync_with_stdio(0);
  65. cin.tie(0),cout.tie(0);
  66. cin>>n>>m>>q;
  67. for(int i=1;i<=m;i++){
  68. cin>>u[i]>>v[i]>>w[i];
  69. ma[u[i]][v[i]]=ma[v[i]][u[i]]=i;
  70. }for(int i=1;i<=q;i++){
  71. cin>>qo[i]>>qx[i]>>qy[i];
  72. if(qo[i]==2) mp[ma[qx[i]][qy[i]]]=1;
  73. }for(int i=1;i<=m;i++) if(!mp[i]) add(i);
  74. for(int i=q;i;i--){
  75. if(qo[i]==1){
  76. split(qx[i]+m,qy[i]+m);
  77. ans[i]=w[id(qy[i]+m)];
  78. }else add(ma[qx[i]][qy[i]]);
  79. }for(int i=1;i<=q;i++)
  80. if(ans[i]) cout<<ans[i]<<"\n";
  81. return 0;
  82. }

[WC2006] 水管局长 题解的更多相关文章

  1. BZOJ2594: [Wc2006]水管局长数据加强版

    题解: 裸LCT+离线+二分+MST... 代码:(几乎摘抄自hzwer) #include<cstdio> #include<cstdlib> #include<cma ...

  2. P4172 [WC2006]水管局长

    P4172 [WC2006]水管局长 前言 luogu数据太小 去bzoj,他的数据大一些 思路 正着删不好维护 那就倒着加,没了 LCT维护他的最小生成树MST 树上加一条边肯定会有一个环 看看环上 ...

  3. bzoj 2594: [Wc2006]水管局长数据加强版 动态树

    2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 934  Solved: 291[Submit][Sta ...

  4. BZOJ 2594: [Wc2006]水管局长数据加强版( LCT )

    离线然后就是维护加边的动态MST, Link cut tree秒掉..不过我写+调了好久...时间复杂度O(NlogN + MlogM) ------------------------------- ...

  5. [bzoj2594][Wc2006]水管局长数据加强版 (lct)

    论蒟蒻的自我修养T_T.. 和noi2014魔法森林基本一样...然而数据范围大得sxbk...UPD:这题如果用lct判联通的话可能会被卡到O(mlogm)..所以最好还是用并查集吧 一开始数组开太 ...

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

    2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 2917  Solved: 918[Submit][St ...

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

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

  8. P4172 [WC2006]水管局长(LCT)

    P4172 [WC2006]水管局长 LCT维护最小生成树,边权化点权.类似 P2387 [NOI2014]魔法森林(LCT) 离线存储询问,倒序处理,删边改加边. #include<iostr ...

  9. [BZOJ2594][WC2006]水管局长加强版(LCT+Kruskal)

    2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 4452  Solved: 1385[Submit][S ...

  10. [BZOJ2594] [WC2006]水管局长(Kruskal+LCT)

    [BZOJ2594] [WC2006]水管局长(Kruskal+LCT) 题面 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可 ...

随机推荐

  1. Ant Design Pro项目ProTable怎么获取搜索表单值

    前情 公司有经常需要做一些后台管理页面,我们选择了Ant Design Pro,它是基于 Ant Design 和 umi 的封装的一整套企业级中后台前端/设计解决方案. 产品效果图 最新接到的一个后 ...

  2. 数据万象推出智能检索MetaInsight,现已开启限时公测

    海量文件的分析统计一直是对象存储COS的热点需求,伴随AIGC飞速迭代发展,在众多不同模态素材的海洋中,用户也急需更高效地管理和利用多媒体内容,打破传统搜索的桎梏. 数据万象推出的智能检索 MetaI ...

  3. 在腾讯云 EMR 上使用 GooseFS 加速大数据计算服务

    GooseFS 是腾讯云对象存储团队最新推出的高性能.高可用以及可弹性伸缩的分布式缓存系统,依靠对象存储(Cloud Object Storage,COS)作为数据湖存储底座的成本优势,为数据湖生态中 ...

  4. 鸿蒙应用开发从入门到入行 - 篇8:Tabs选项卡页签视图切换

    鸿蒙应用开发从入门到入行 第八天 - Tabs选项卡 导读:在本篇文章里,您将掌握使用Tabs选项卡做栏目分类,这是未来应用开发中极为常用的组件 首先说一声抱歉,比较忙很久没更新了.但放心吧,目前该忙 ...

  5. spring 项目实现带请求链路id的日志记录

    我们在做java项目的时候通常需要通过请求日志来排查定位线上问题,在日志比较多而我们又需要查找整个请求的全部日志的时候会比较困难.所以,就需要在日志记录的时候讲同一个请求的关键日志用同一个唯一标识串联 ...

  6. JavaScript 的 Mixin 问题

    JavaScript 从 ES6 开始支持 class 了, 如何在现在的 class 上实现 mixin 呢? 很多人推荐这种搞法 Object.assign(MyClass.prototype, ...

  7. 【Web前端】【开源分享】H5登陆界面 - 2021年12月24日

    点我下载

  8. 第 5 章 Debian 系统中可用的软件

    目录 5.1. Debian GNU/Linux 收录了哪些类型的应用程序和开发工具? 5.2. 谁编写了所有这些软件? 5.3. 我应该如何获得一份 Debian 打包的程序的最新列表? 5.4. ...

  9. 冒泡排序------python实现

    if __name__ == '__main__': ''' 算法描述 1.比较相邻的元素,更具大小交互位置 2.对每一对相邻元素作同样的工作,从开始第一队到结尾的最后一对,即可选出最大的数 3.所有 ...

  10. 判断移动终端类型安卓苹果鸿蒙、查看设备详细信息、跳转到各手机应用商店、判断APP是否已安装

      案例1:判断移动终端类型,微信扫描二维码链接可以区分华为(荣耀).安卓.苹果手机.华为及荣耀会跳到华为应用商店.安卓会提示浏览器打开.苹果跳到苹果商店. <!DOCTYPE html> ...