前言

话说LCTLCTLCT的SplaySplaySplay和平时写的SplaySplaySplay差别好大,调了我半天


正题

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


题目大意

nnn个点mmm条边有a,ba,ba,b两个值,求一条路径从1−>n1->n1−>n使得路径上最大的aaa加上最大的bbb最小。


解题思路

我们可以将边按照aaa排序,然后枚举最大的aaa值。此时我们需要维护1−>n1->n1−>n路径上最小的bbb值,要支持动态插边。

考虑使用LCTLCTLCT,对于一条(x,y,w)(x,y,w)(x,y,w)的边,我们查询目前x,yx,yx,y之间路径上的最大边,如果该值比www大,我们断开最大边,连接该边,否则不连接即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
struct node{int x,y,a,b;
}a[N];
int n,m,val[N],sum[N],from[N],fa[N],ans;
struct Line_Cut_Tree{#define ls t[x][0]#define rs t[x][1]int t[N][2],fa[N];bool r[N];void PushR(int x){r[x]^=1;swap(ls,rs);}void PushDown(int x){if(r[x]){r[x]=0;PushR(ls);PushR(rs);}}bool Nroot(int x){return fa[x]&&(t[fa[x]][0]==x||t[fa[x]][1]==x);}void PushUp(int x){sum[x]=val[x];from[x]=x;if(ls&&sum[ls]>sum[x]) sum[x]=sum[ls],from[x]=from[ls];if(rs&&sum[rs]>sum[x]) sum[x]=sum[rs],from[x]=from[rs];}void Rotate(int x){int y=fa[x],z=fa[y],k=(t[y][1]==x),w=t[x][!k];if(Nroot(y)) t[z][t[z][1]==y]=x;t[x][!k]=y;t[y][k]=w;if(w) fa[w]=y;fa[y]=x;fa[x]=z;PushUp(y);PushUp(x);return;}void Updata(int x){if(Nroot(x))Updata(fa[x]);PushDown(x);}void Splay(int x){int y=x,z=0;Updata(x);while(Nroot(x)){y=fa[x];z=fa[y];if(Nroot(y))Rotate((t[y][0]==x)^(t[z][0]==y)?x:y);Rotate(x);}PushUp(x);return;}void Access(int x){for(int y=0;x;x=fa[y=x])Splay(x),rs=y,PushUp(x);return;}void MakeRoot(int x){Access(x);Splay(x);PushR(x);return;}int Split(int x,int y){MakeRoot(x);Access(y);Splay(y);return from[y];}void Link(int x,int y){MakeRoot(x);fa[x]=y;Access(x);return;}void Cut(int x,int y){MakeRoot(y);Access(x);Splay(x);fa[ls]=0;ls=0;PushUp(x);return;}#undef ls#undef rs
}LCT;
int Find(int x)
{return fa[x]==x?x:(fa[x]=Find(fa[x]));}
bool cMp(node x,node y)
{return x.a<y.a;}
int main()
{scanf("%d%d",&n,&m);ans=2147483647;for(int i=1;i<=n;i++)fa[i]=i;for(int i=1;i<=m;i++)scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].a,&a[i].b);sort(a+1,a+1+m,cMp);for(int i=1;i<=m;i++)val[i+n]=sum[i+n]=a[i].b,from[i+n]=i+n;for(int i=1;i<=m;i++){int Fa=Find(a[i].x),Fb=Find(a[i].y);bool line=1;if(Fa==Fb){int p=LCT.Split(a[i].x,a[i].y);if(sum[p]>a[i].b)LCT.Cut(a[p-n].x,p),LCT.Cut(a[p-n].y,p);else line=0;}else fa[Fa]=Fb;if(line) LCT.Link(a[i].x,i+n),LCT.Link(a[i].y,i+n);if(Find(1)==Find(n))ans=min(ans,a[i].a+sum[LCT.Split(1,n)]);}if(ans==2147483647) printf("-1");else printf("%d",ans);
}

P2387-[NOI2014]魔法森林【LCT】相关推荐

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

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

  2. BZOJ 3669: [Noi2014]魔法森林( LCT )

    排序搞掉一维, 然后就用LCT维护加边MST. O(NlogN) ------------------------------------------------------------------- ...

  3. loj2245 [NOI2014]魔法森林 LCT

    [NOI2014]魔法森林 链接 loj 思路 a排序,b做动态最小生成树. 把边拆成点就可以了. uoj98.也许lct复杂度写假了..越卡常,越慢 代码 #include <bits/std ...

  4. [BZOJ]3669: [Noi2014]魔法森林 lct

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

  5. P2387 [NOI2014]魔法森林

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

  6. NOI2014魔法森林--LCT

    题意:求一条1->n的路径,使得路径上的MAXA+MAXB最小. 做法:以a值从小到大对边排序,动态加边,维护一个最小生成树就行了.如果两个端点不连通,则直接加上,否则就把这个环上b值最大的边删 ...

  7. [BZOJ3669]-[Noi2014]魔法森林-LCT+并查集

    说在前面 刚刚去写了一道SPFA+网络流的糅合题,1A了 闲着没事干开始翻起了status,发现有人在做水管局长,哇这不是LCT嘛! 然后回头看了一下自己写过的寥寥无几的LCT的题,发现都快要忘了 于 ...

  8. P2387 [NOI2014] 魔法森林

    简要题意: 给定一些无向边,每条边有 a a a 和 b b b 两个权值,要求判断能否到达终点 n n n ,能到达,就输出路径的最小的值,定义路径的最小值为这条路径上 a a a 和 b b b ...

  9. [LCT动态树] [NOI2014]魔法森林,[ZJOI2018]历史

    [NOI2014] 魔法森林 题目 按照aaa精灵从小到大排序 按顺序插入每一条边 加入第iii条边后的最小代价为a[i]a[i]a[i]加上从111到nnn的所有路径中最大bbb最小的路径代价 维护 ...

  10. 【bzoj3669】[Noi2014]魔法森林【LCT】

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

最新文章

  1. 或许有一两点你不知的C语言特性
  2. void *变量用法
  3. org.apache.hadoop.hive.metastore.api.InvalidObjectException: Role public already exists.
  4. 通过javascript实现的轻量级模态框解决方案(支持Ajax)
  5. FSAF 让网络自己决定实例输出层
  6. android m在哪下载地址,android m预览版SDK下载地址 android m预览版SDK下载网址
  7. 【Docker】安装MySQL彻底解决3306端口占用问题
  8. iocp三层架构服务器模型
  9. 点云自适应滤波matlab代码,散乱点云自适应滤波算法
  10. Fiddler | fiddler的https设置/证书失效怎么办
  11. 2022蓝桥杯冲刺(历年真题剖析,含省赛、国赛)
  12. 史上最通俗易懂的并查集算法详解
  13. win7序列号(可激活所有版本)
  14. android防丢器设计,基于单片机的防丢器设计
  15. 【网络】MTU理解、MTU对上层协议的影响
  16. 与其说我害怕成为普通人,还不如说我害怕生活,害怕找不到一种自己喜欢的方式去度过人生...
  17. JavaScript弹性透明的图片放大代码
  18. 算法笔记(六)多尺度特征融合之FPN/PANet
  19. GPL和LGPL协议
  20. 淘宝/天猫平台商品详情API接口调用说明

热门文章

  1. python input输入多个变量_「Python 秘籍」1.2 解压可迭代对象赋值给多个变量
  2. 金蝶显示服务器异常,金蝶提示云服务器异常
  3. Java千万数据导入mysql_java之5分钟插入千万条数据
  4. mysql80重置密码_MySQL8.0修改密码问题
  5. 在linux文件共享接口,入坑Linux-day13(使用vsftpd服务传输文件、使用Samba或NFS实现文件共享)...
  6. 云服务器下行_腾讯云轻量应用服务器简单测评
  7. php怎么压缩文字,php实现的简单压缩英文字符串的代码
  8. centos rpm 安装 perl_Linux【常用软件安装篇】
  9. [JavaWeb-XML]XML基本语法与快速入门
  10. [剑指offer]面试题17:合并两个排序的链表