Portal-->bzoj3669

Solution

​   愉悦智力康复ing

​​   这题的话有两个比较关键的地方

​​   首先是答案肯定是原图的某个生成树上的一条路径,那么我们考虑怎么来找这个生成树,因为关键值有两个,所以我们这里可以采取这样的一个方式:先对其中一个关键值排序

​​   我们先将所有的边按照\(a\)值排序,然后按顺序加边,如果说当前这条边连接的两个点已经连通了,那么我们要考虑删掉一条边或者干脆不加这条边

​   这里我们可以用一个贪心的思想,删边的话肯定是删当前的边中\(b\)最大的那个(如果要加的那条边的\(b\)是最大的那么我们就不加这条边),如果说我们加了这条边并且\(1\)和\(n\)连通了,那么可以用当前最大的\(b\)+当前的\(a\)来更新答案(因为\(a\)是升序排列的,所以当前的\(a\)一定是最大的)

​​   接着是第二部分,如何维护\(b\)的最大值?

​​   又要删边又要加边的维护的又是链的数据,那当然是LCT咯qwq,但是因为这个地方我们是要维护边权,所以我们将每一条边变成一个点,然后其他的就全部都是常规操作了ovo

​​   好像是比较套路的一题qwq

​  

​​   代码大概长这个样子

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define mp make_pair
  6. #define Pr pair<int,int>
  7. using namespace std;
  8. const int N=50010,M=100010,L=N+M;
  9. const int inf=2147483647;
  10. struct Rec{
  11. int a,b,x,y,id;
  12. friend bool operator <(Rec x,Rec y){return x.a<y.a;}
  13. }a[M];
  14. int n,m,ans;
  15. namespace Lct{/*{{{*/
  16. int ch[L][2],fa[L],mx[L],loc[L],rev[L];
  17. int b[L];
  18. int tot;
  19. bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
  20. int which(int x){return ch[fa[x]][1]==x;}
  21. void reverse(int x){
  22. swap(ch[x][0],ch[x][1]);
  23. rev[x]^=1;
  24. }
  25. void pd(int x){
  26. if (rev[x]){
  27. if (ch[x][0]) reverse(ch[x][0]);
  28. if (ch[x][1]) reverse(ch[x][1]);
  29. rev[x]=0;
  30. }
  31. }
  32. void pushdown(int x){
  33. if (!isroot(x)) pushdown(fa[x]);
  34. pd(x);
  35. }
  36. void pushup(int x){
  37. mx[x]=b[x]; loc[x]=x;
  38. if (ch[x][0]){
  39. if (mx[ch[x][0]]>mx[x])
  40. mx[x]=mx[ch[x][0]],loc[x]=loc[ch[x][0]];
  41. }
  42. if (ch[x][1]){
  43. if (mx[ch[x][1]]>mx[x])
  44. mx[x]=mx[ch[x][1]],loc[x]=loc[ch[x][1]];
  45. }
  46. }
  47. void rotate(int x){
  48. int dir=which(x),f=fa[x];
  49. if (!isroot(f)) ch[fa[f]][which(f)]=x;
  50. if (ch[x][dir^1]) fa[ch[x][dir^1]]=f;
  51. fa[x]=fa[f];
  52. ch[f][dir]=ch[x][dir^1];
  53. ch[x][dir^1]=f; fa[f]=x;
  54. pushup(f);
  55. pushup(x);
  56. }
  57. void splay(int x){
  58. pushdown(x);
  59. for (int f=fa[x];!isroot(x);f=fa[x]){
  60. if (!isroot(f))
  61. rotate(which(f)==which(x)?f:x);
  62. rotate(x);
  63. }
  64. }
  65. void access(int x){
  66. for (int last=0;x;last=x,x=fa[x]){
  67. splay(x);
  68. ch[x][1]=last;
  69. pushup(x);
  70. }
  71. }
  72. void make_rt(int x){
  73. access(x);
  74. splay(x);
  75. reverse(x);
  76. }
  77. bool connected(int x,int y){
  78. if (x==y) return true;
  79. make_rt(x);
  80. access(y);
  81. splay(y);
  82. return fa[x];
  83. }
  84. bool check(int x,int y){
  85. make_rt(x);
  86. access(y);
  87. splay(y);
  88. return ch[y][0]==x;
  89. }
  90. void cut(int x,int y){
  91. //printf("Cut %d %d\n",x,y);
  92. make_rt(x);
  93. access(y);
  94. splay(y);
  95. fa[x]=0;
  96. ch[y][0]=0;
  97. pushup(y);
  98. }
  99. Pr query(int x,int y){
  100. make_rt(x);
  101. access(y);
  102. splay(y);
  103. return mp(mx[y],loc[y]);
  104. }
  105. void link(int x,int y){
  106. //printf("Link %d %d\n",x,y);
  107. make_rt(y);
  108. fa[y]=x;
  109. pushup(x);
  110. }
  111. void Link(int x,int y,int bian,int vala){
  112. int tmp;
  113. if (x==y) return;
  114. if (connected(x,y)){
  115. tmp=query(x,y).second;
  116. if (b[bian]<b[tmp]){
  117. cut(a[tmp-n].x,tmp);
  118. cut(a[tmp-n].y,tmp);
  119. link(x,bian);
  120. link(y,bian);
  121. }
  122. }
  123. else{
  124. link(x,bian);
  125. link(y,bian);
  126. }
  127. if (connected(1,n)){
  128. tmp=query(1,n).first;
  129. ans=min(ans,tmp+vala);
  130. }
  131. }
  132. }/*}}}*/
  133. void build(){
  134. sort(a+1,a+1+m);
  135. for (int i=1;i<=m;++i){
  136. a[i].id=i+n;
  137. Lct::b[a[i].id]=a[i].b;
  138. Lct::pushup(a[i].id);
  139. }
  140. }
  141. void solve(){
  142. ans=inf;
  143. int tmp=0;
  144. for (int i=1;i<=m;++i){
  145. Lct::Link(a[i].x,a[i].y,a[i].id,a[i].a);
  146. //printf("%d\n",ans);
  147. }
  148. if (ans!=inf) printf("%d\n",ans);
  149. else printf("-1\n");
  150. }
  151. int main(){
  152. #ifndef ONLINE_JUDGE
  153. freopen("a.in","r",stdin);
  154. #endif
  155. scanf("%d%d",&n,&m);
  156. for (int i=1;i<=m;++i){
  157. scanf("%d%d%d%d\n",&a[i].x,&a[i].y,&a[i].a,&a[i].b);
  158. }
  159. build();
  160. //for (int i=1;i<=m;++i) printf("%d %d %d %d\n",a[i].x,a[i].y,a[i].a,a[i].b);
  161. solve();
  162. }

【bzoj3669】魔法森林的更多相关文章

  1. BZOJ-3669 魔法森林 Link-Cut-Tree

    意识到背模版的重要性了,记住了原理和操作,然后手打模版残了..颓我时间...... 3669: [Noi2014]魔法森林 Time Limit: 30 Sec Memory Limit: 512 M ...

  2. [BZOJ3669]魔法森林

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  3. 洛谷2387 BZOJ3669魔法森林题解

    题目链接 BZ链接 这道题被很多人用spfa水了过去,表示很... 其实spfa很好卡,这组数据可以卡掉大多数spfa 链接:密码:rjvk 这里讲一下LCT的做法 我们按照a将边排序,然后依次添加 ...

  4. 【BZOJ3669】【Noi2014】魔法森林(Link-Cut Tree)

    [BZOJ3669][Noi2014]魔法森林(Link-Cut Tree) 题面 题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n ...

  5. bzoj3669: [Noi2014]魔法森林 lct版

    先上题目 bzoj3669: [Noi2014]魔法森林 这道题首先每一条边都有一个a,b 我们按a从小到大排序 每次将一条路劲入队 当然这道题权在边上 所以我们将边化为点去连接他的两个端点 当然某两 ...

  6. [bzoj3669][Noi2014]魔法森林_LCT_并查集

    魔法森林 bzoj-3669 Noi-2014 题目大意:说不明白题意系列++……题目链接 注释:略. 想法:如果只有1个参量的话spfa.dij什么的都上来了. 两个参量的话我们考虑,想将所有的边按 ...

  7. 【BZOJ3669】[Noi2014]魔法森林 LCT

    终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...

  8. BZOJ3669[Noi2014]魔法森林——kruskal+LCT

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

  9. 【NOI2014】【BZOJ3669】【UOJ#3】魔法森林

    我学会lct辣 原题: 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为 1…n1…n,边标号为1…m1…m.初始时小E ...

  10. BZOJ3669:[NOI2014]魔法森林——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3669 https://www.luogu.org/problemnew/show/P2387 为了得 ...

随机推荐

  1. Linux工作管理

    工作管理? 其实也就是把程序放到后台来管理,在windows中也就是最小化,在Linux中是通过命令把程序放到后台中.jobs命令查看后台程序. 对于第一点注意事项,mysql启动是例外的,要是叉掉了 ...

  2. mnist手写数字识别(Logistic回归)

    import numpy as np from sklearn.neural_network import MLPClassifier from sklearn.linear_model import ...

  3. 阿里云服务器Centos上Apache安装SSL证书配置Https

    首先我们先去阿里云申请一个免费的SSL证书(https://common-buy.aliyun.com/?spm=5176.7968328.1266638..5e971232BzMSp5&co ...

  4. 高可用Kubernetes集群-6. 部署kube-apiserver

    八.部署kube-apiserver 接下来3章节是部署Kube-Master相关的服务,包含:kube-apiserver,kube-controller-manager,kube-schedule ...

  5. Vyatta 网络操作系统

    原文发表于:2010-09-19 转载至cu于:2012-07-21 以下是"开源中国社区"写到的: http://www.oschina.net/news/11423/vyatt ...

  6. Hackerank-Array-NewYearChaos

    题目背景描述 新年第一天,N 个人排队坐过山车.每个人穿有带编号的衣服 \([1, 2, 3, ...]\). 因为排队时间太久,有人发现给前面相邻的人喂一颗糖,就可以和他交换位置,而每人手里只有两颗 ...

  7. 3.10-通过requests、BeautifulSoup、webbrowser模块的相关方法,爬取网页数据示例程序(一)

    import requests,bs4res=requests.get('https://www.hao123.com/')print('res对象的类型:',type(res))res.raise_ ...

  8. BVT、EVT、DVT、PVT产品开发几个阶段

      EVT EVT(Engineering Verification Test) 工程验证 产品开发初期的设计验证.设计者实现样品时做初期的测试验证,包括 功能和安规测试,一般由 RD(Researc ...

  9. 20162328蔡文琛 week06 大二

    20162328 2017-2018-1 <程序设计与数据结构>第6周学习总结 教材学习内容总结 队列元素按FIFO的方式处理----最先进入的元素最先离开. 队列是保存重复编码k值得一种 ...

  10. AOP:spring 的Annotation配置

    1.文件目录: 2.实体类 package com.wangcf.po; public class User { private int id; private String name; privat ...