传送门

这题似乎不好直接做,可以考虑按照\(a_i\)升序排序,然后依次加边更新答案

具体实现方法是用lct维护当前的树,这里需要维护链上最大的\(b_i\).每次加一条边,如果加完以后没有环直接加,否则找出链上最大的\(b_i\),如果这个\(b_i\)比当前的\(b_i\)小,加了肯定不优,否则就把那条边断掉,加上这条边.每次用当前\(a_i\)和1到n链上最大\(b_i\)更新答案

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define db long double
  4. #define il inline
  5. using namespace std;
  6. const int N=1e5+10;
  7. il LL rd()
  8. {
  9. LL x=0,w=1;char ch=0;
  10. while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
  11. while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
  12. return x*w;
  13. }
  14. int n,m,w[N],po[N][2],tt;
  15. int fa[N],ch[N][2],id[N],vi[N];
  16. bool tg[N];
  17. bool nrt(int x){return ch[fa[x]][0]==x||ch[fa[x]][1]==x;}
  18. void psup(int x)
  19. {
  20. id[x]=w[id[ch[x][0]]]>w[id[ch[x][1]]]?id[ch[x][0]]:id[ch[x][1]];
  21. id[x]=w[id[x]]>w[vi[x]]?id[x]:vi[x];
  22. }
  23. void rev(int x){if(x) swap(ch[x][0],ch[x][1]),tg[x]^=1;}
  24. void psdn(int x){if(tg[x]) rev(ch[x][0]),rev(ch[x][1]),tg[x]=0;}
  25. void ppush(int x)
  26. {
  27. if(nrt(x)) ppush(fa[x]);
  28. psdn(x);
  29. }
  30. void rot(int x)
  31. {
  32. int y=fa[x],z=fa[y],yy=ch[y][1]==x,w=ch[x][!yy];
  33. if(nrt(y)) ch[z][ch[z][1]==y]=x;
  34. ch[y][yy]=w,ch[x][!yy]=y;
  35. if(w) fa[w]=y;
  36. fa[x]=z,fa[y]=x;
  37. psup(y);
  38. }
  39. void spl(int x)
  40. {
  41. ppush(x);
  42. while(nrt(x))
  43. {
  44. int y=fa[x];
  45. if(nrt(y)) ((ch[y][1]==x)^(ch[fa[y]][1]==y))?rot(x):rot(y);
  46. rot(x);
  47. }
  48. psup(x);
  49. }
  50. void acs(int x)
  51. {
  52. for(int y=0;x;y=x,x=fa[x])
  53. spl(x),ch[x][1]=y,psup(x);
  54. }
  55. void mkrt(int x)
  56. {
  57. acs(x),spl(x),rev(x);
  58. }
  59. int fdrt(int x)
  60. {
  61. acs(x),spl(x);
  62. psdn(x);
  63. while(ch[x][0]) x=ch[x][0],psdn(x);
  64. return x;
  65. }
  66. void split(int x,int y)
  67. {
  68. mkrt(x),acs(y),spl(y);
  69. }
  70. void link(int x,int y,int z)
  71. {
  72. mkrt(x);
  73. if(fdrt(y)!=x)
  74. {
  75. mkrt(y);
  76. w[++tt]=z,vi[tt]=tt,po[tt][0]=x,po[tt][1]=y;
  77. fa[x]=fa[y]=tt;
  78. return;
  79. }
  80. acs(y),spl(y);
  81. int ii=id[y];
  82. if(w[ii]<=z) return;
  83. mkrt(po[ii][0]),acs(po[ii][1]),spl(ii);
  84. fa[po[ii][0]]=fa[po[ii][1]]=ch[ii][0]=ch[ii][1]=0,psup(ii);
  85. w[ii]=z,po[ii][0]=x,po[ii][1]=y;
  86. mkrt(x),mkrt(y);
  87. fa[x]=fa[y]=ii;
  88. }
  89. struct edge
  90. {
  91. int x,y,a,b;
  92. bool operator < (const edge &bb) const {return a<bb.a;}
  93. }e[N];
  94. int main()
  95. {
  96. n=rd(),m=rd();
  97. for(int i=1;i<=m;++i)
  98. {
  99. int x=rd(),y=rd(),a=rd(),b=rd();
  100. e[i]=(edge){x,y,a,b};
  101. }
  102. sort(e+1,e+m+1);
  103. tt=n,w[0]=-(1<<30);
  104. int ans=1<<30;
  105. for(int i=1;i<=m;++i)
  106. {
  107. if(e[i].x==e[i].y) continue;
  108. link(e[i].x,e[i].y,e[i].b);
  109. mkrt(1);
  110. if(fdrt(n)==1) ans=min(ans,e[i].a+w[id[n]]);
  111. }
  112. printf("%d\n",ans<(1<<29)?ans:-1);
  113. return 0;
  114. }

luogu P2387 [NOI2014]魔法森林的更多相关文章

  1. [Luogu P2387] [NOI2014]魔法森林 (LCT维护边权)

    题面 传送门:https://www.luogu.org/problemnew/show/P2387 Solution 这题的思想挺好的. 对于这种最大值最小类的问题,很自然的可以想到二分答案.很不幸 ...

  2. P2387 [NOI2014]魔法森林(LCT)

    P2387 [NOI2014]魔法森林 LCT边权维护经典题 咋维护呢?边化为点,边权变点权. 本题中我们把边对关键字A进行排序,动态维护关键字B的最小生成树 加边后出现环咋办? splay维护最大边 ...

  3. 洛谷 P2387 [NOI2014]魔法森林 解题报告

    P2387 [NOI2014]魔法森林 题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2 ...

  4. 洛谷P2387 [NOI2014]魔法森林(lct维护最小生成树)

    题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,…,n,边标号为 1,2,3,…, ...

  5. P2387 [NOI2014]魔法森林 LCT维护最小生成树

    \(\color{#0066ff}{ 题目描述 }\) 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 ...

  6. 洛谷P2387 [NOI2014]魔法森林(LCT)

    魔法森林 题目传送门 解题思路 把每条路按照\(a\)的值从小到大排序.然后用LCT按照b的值维护最小生成树,将边按照顺序放入.如果\(1\)到\(n\)有了一条路径,就更新最小答案.这个过程就相当于 ...

  7. 洛谷P2387 [NOI2014]魔法森林(LCT,Splay)

    在XZY&XZZ巨佬的引领下,一枚蒟蒻终于啃动了这道题...... 这次还是第一次写LCT维护边权,还要化边为点,思路乱七八糟的,写起来也不顺手,还好调了许久终于AC啦. 贪心排序按一个关键字 ...

  8. 洛谷P2387 [NOI2014]魔法森林(LCT)

    在XZY&XZZ巨佬的引领下,一枚蒟蒻终于啃动了这道题...... 这次还是第一次写LCT维护边权,还要化边为点,思路乱七八糟的,写起来也不顺手,还好调了许久终于AC啦. 贪心排序按一个关键字 ...

  9. P2387 [NOI2014]魔法森林

    传送门 如果一条边只要考虑 $a$ 的限制,那么显然最小生成树 但是现在有 $a,b$ 两个限制,所以考虑按 $a$ 从小到大枚举边,动态维护 $b$ 的最小生成树 考虑新加入的一条边 $x,y$ , ...

随机推荐

  1. A1057. Stack

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  2. 跟着 underscore 学节流

    更多内容请参考:我的新博客 在上一篇文章中,我们了解了为什么要限制事件的频繁触发,以及如何做限制: debounce 防抖 throttle 节流 上次已经说过防抖的实现了,今天主要来说一下节流的实现 ...

  3. Django cookie相关操作

    Django cookie 的相关操作还是比较简单的 首先是存储cookie #定义设置cookie(储存) def save_cookie(request): #定义回应 response = Ht ...

  4. 第十四篇-ImageButton控制聚焦,单击,常态三种状态的显示背景

    这里先用XML设置. myselector.xml <?xml version="1.0" encoding="utf-8"?> <selec ...

  5. 2018.11.26 QLU新生赛部分题解

    问题 L: 寄蒜几盒? 题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Ye ...

  6. jQuery、layer实现弹出层的打开、关闭功能实例详解

    本文主要介绍了jQuery.layer实现弹出层的打开.关闭功能,需要的朋友可以参考下,希望能帮助到大家. 打开弹出层: 在list页面带入layer.js 在list页面点击时,弹出form弹出层, ...

  7. Luogu2495[SDOI2011]消耗战

    题目描述 在一场战争中,战场由\(n\)岛屿和\(n-1\)个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为\(1\)的岛屿,而且他们已经没有足够多的能源维系战 ...

  8. 上这个资源网站,让你轻松无忧找mac软件资源

    之前分享过好几篇关于mac软件相关的文章(想要看其他的mac软件专题文章,可以关注我,点击进入查看发表的文章),有网友表示,优质的软件推荐清单有了,想要下载和获取mac软件,买一个正版软件在APP s ...

  9. 简洁架构的思想,基于go实现

    https://manuel.kiessling.net/2012/09/28/applying-the-clean-architecture-to-go-applications/ 从 Clean- ...

  10. MapReduce-提交job源码分析

    MapReduce-提交job源码分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.环境准备 1>.顺手的IDE,大家可以根据自己的喜好选择你喜欢的IDE 博主推荐以下 ...