蒟蒻又发现自己还没写过LCT……

首先显然按照权值a从小到大排序,维护b的最小生成树。然后直接扫,代价是加入b的最大值,然后动态加边,因为有边权,所以在lct中边应该理解为点。每次连接(u,v)时,若不连通则直接连起来,反之则需选择b最大的边断开。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+;
struct node{int a,b,x,y;}q[N];
int n,m,len,fa[N],lc[N],rc[N],rev[N],b[N],val[N],s[N],f[N];
bool cmp(node a,node b){return a.y<b.y;}
int dir(int x){return x==rc[fa[x]];}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
void union1(int x,int y){x=find(x),y=find(y);if(x!=y)f[x]=y;}
bool isroot(int x){return!fa[x]||lc[fa[x]]!=x&&rc[fa[x]]!=x;}
void pushup(int x)
{
s[x]=x;
if(lc[x]&&val[s[lc[x]]]>val[s[x]])s[x]=s[lc[x]];
if(rc[x]&&val[s[rc[x]]]>val[s[x]])s[x]=s[rc[x]];
}
void pushdown(int x)
{
if(rev[x])
{
swap(lc[x],rc[x]);
if(lc[x])rev[lc[x]]^=;
if(rc[x])rev[rc[x]]^=;
rev[x]=;
}
}
void rotate(int x)
{
int y=fa[x],z=fa[y],w=x==lc[y]?rc[x]:lc[x];
if(z&&!isroot(y))(y==lc[z]?lc[z]:rc[z])=x;
fa[x]=z,fa[y]=x;
if(w)fa[w]=y;
if(x==lc[y])rc[x]=y,lc[y]=w;else lc[x]=y,rc[y]=w;
pushup(y),pushup(x);
}
void splay(int x)
{
int len=,y=x;b[]=x;
while(!isroot(y))b[++len]=fa[y],y=fa[y];
for(int i=len;i;i--)pushdown(b[i]);
while(!isroot(x))
{
if(!isroot(fa[x]))
{
if(dir(x)==dir(fa[x]))rotate(fa[x]);
else rotate(x);
}
rotate(x);
}
pushup(x);
}
void access(int x)
{
int y=;
while(x)
{
splay(x),rc[x]=y;
if(y)fa[y]=x;
pushup(x),y=x,x=fa[x];
}
}
int findrt(int x)
{
access(x),splay(x),pushdown(x);
while(lc[x])x=lc[x];
splay(x);
return x;
}
void reverse(int x){access(x),splay(x),rev[x]^=;}
void link(int x,int y){reverse(x),fa[x]=y;}
void cut(int x,int y){reverse(x),access(y),splay(y),lc[y]=fa[x]=,pushup(y);}
int query(int x,int y){reverse(x),access(y),splay(y);return s[y];}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)scanf("%d%d%d%d",&q[i].a,&q[i].b,&q[i].x,&q[i].y);
sort(q+,q+m+,cmp);
for(int i=;i<=n+m;i++)f[i]=s[i]=i;
for(int i=n+;i<=n+m;i++)val[i]=q[i-n].x;
int ans=2e9;
for(int i=;i<=m;i++)
{
int u=q[i].a,v=q[i].b;
bool flag=;
if(find(u)==find(v))
{
int w=query(u,v);
if(val[w]>q[i].x)cut(q[w-n].a,w),cut(w,q[w-n].b);else flag=;
}
else union1(u,v);
if(flag)link(u,i+n),link(i+n,v);
if(find()==find(n))ans=min(ans,q[i].y+val[query(,n)]);
}
if(ans<2e9)printf("%d",ans);else puts("-1");
}

[NOI2014]魔法森林(LCT)的更多相关文章

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

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

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

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3669 题面: 3669: [Noi2014]魔法森林 Time Limit: 30 Sec  ...

  3. [NOI2014]魔法森林 LCT

    题面 [NOI2014]魔法森林 题解 一条路径的代价为路径上的\(max(a[i]) + max(b[i])\),因为一条边同时有$a[i], b[i]$2种权值,直接处理不好同时兼顾到,所以我们考 ...

  4. loj2245 [NOI2014]魔法森林 LCT

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

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

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

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

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

  7. bzoj 3669: [Noi2014] 魔法森林 LCT版

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

  8. BZOJ 3669: [Noi2014]魔法森林 [LCT Kruskal | SPFA]

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

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

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

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

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

随机推荐

  1. Node.js 发送Email

    章节 Node.js 介绍 Node.js 入门 Node.js 模块 Node.js HTTP模块 Node.js 文件系统模块 Node.js URL模块 Node.js NPM Node.js ...

  2. ACM-数细胞

    题目描述:数细胞 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.编程需要用到的队列及其相关函数已经实现,你只需要完成 ...

  3. vue学习(一)ES6常用语法

    1 ES6常用语法 1.1 变量提升 例① # 变量提升 <div id="app"> </div> <script> console.log( ...

  4. javascript中的私有作用域

    我们知道js中所有的块级作用域都是无效的,块级作用域内的变量,在外部仍然可以被读取,其实是申明在外部的.如何实现变量的私有化,只在块级作用域起效,避免污染全局的变量呢.而且,挂载在全局的变量很难被回收 ...

  5. SpringCloud学习之Sleuth服务链路跟踪(十二)

    一.为什么需要Spring Cloud Sleuth 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元.由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很 ...

  6. zoj 2314Reactor Cooling

    秘制神奇上下界网络流%%% 什么什么有(木)源汇可行流什么的,,看不懂(一下纯属个人sb言论) 看了半天知道点,一个点u,从S连到u的流量是全部流入u的下界,u到T是全部流出u的下界和.(进去出来的约 ...

  7. 一个PHP的SQL注入完整过程

    本篇文章介绍的内容是一个PHP的SQL注入完整过程,现在分享给大家,有需要的朋友可以参考一下 希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里 ...

  8. Flink并行度

    并行执行 本节介绍如何在Flink中配置程序的并行执行.FLink程序由多个任务(转换/操作符.数据源和sinks)组成.任务被分成多个并行实例来执行,每个并行实例处理任务的输入数据的子集.任务的并行 ...

  9. [DDCTF 2019]homebrew event loop

    0x00 知识点 逻辑漏洞: 异步处理导致可以先调用增加钻石,再调用计算价钱的.也就是先货后款. eval函数存在注入,可以通过#注释,我们可以传入路由action:eval#;arg1#arg2#a ...

  10. [CISCN 2019 初赛]Love Math

    0x00 知识点 PHP函数: scandir() 函数:返回指定目录中的文件和目录的数组. base_convert() 函数:在任意进制之间转换数字. dechex() 函数:把十进制转换为十六进 ...