[NOI2014]魔法森林(LCT)
蒟蒻又发现自己还没写过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)的更多相关文章
- BZOJ 3669: [Noi2014]魔法森林( LCT )
排序搞掉一维, 然后就用LCT维护加边MST. O(NlogN) ------------------------------------------------------------------- ...
- bzoj 3669: [Noi2014]魔法森林 (LCT)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3669 题面: 3669: [Noi2014]魔法森林 Time Limit: 30 Sec ...
- [NOI2014]魔法森林 LCT
题面 [NOI2014]魔法森林 题解 一条路径的代价为路径上的\(max(a[i]) + max(b[i])\),因为一条边同时有$a[i], b[i]$2种权值,直接处理不好同时兼顾到,所以我们考 ...
- loj2245 [NOI2014]魔法森林 LCT
[NOI2014]魔法森林 链接 loj 思路 a排序,b做动态最小生成树. 把边拆成点就可以了. uoj98.也许lct复杂度写假了..越卡常,越慢 代码 #include <bits/std ...
- bzoj3669: [Noi2014]魔法森林 lct版
先上题目 bzoj3669: [Noi2014]魔法森林 这道题首先每一条边都有一个a,b 我们按a从小到大排序 每次将一条路劲入队 当然这道题权在边上 所以我们将边化为点去连接他的两个端点 当然某两 ...
- 【BZOJ3669】[Noi2014]魔法森林 LCT
终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...
- bzoj 3669: [Noi2014] 魔法森林 LCT版
Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...
- BZOJ 3669: [Noi2014]魔法森林 [LCT Kruskal | SPFA]
题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,…,n,边标号为 1,2,3,…, ...
- P2387 [NOI2014]魔法森林 LCT维护最小生成树
\(\color{#0066ff}{ 题目描述 }\) 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 ...
- 洛谷P2387 [NOI2014]魔法森林(LCT)
魔法森林 题目传送门 解题思路 把每条路按照\(a\)的值从小到大排序.然后用LCT按照b的值维护最小生成树,将边按照顺序放入.如果\(1\)到\(n\)有了一条路径,就更新最小答案.这个过程就相当于 ...
随机推荐
- 前端01 HTML5
01工具使用 Sublime插件安装和使用 2Sublime插件安装和使用.pcf 3Sublime插件安装与卸载.pcf 4Sublime安装markdown插件.pcf 使用typora生成pdf ...
- POJ - 2253 Frogger(最短路Dijkstra or flod)
题意:要从起点的石头跳到终点的石头,设The frog distance为从起点到终点的某一路径中两点间距离的最大值,问在从起点到终点的所有路径中The frog distance的最小值为多少. 分 ...
- Mongodb集群形式探究-一主一从一仲裁。
主节点(primary)与从节点(secondary)和仲裁节点(arbiter)具有存储数据的两个成员的三个成员副本集具有: ●一个主节点. ●一个从节点. 从节点可以在选举中成为主节点. ...
- 洛谷 P1504 积木城堡
题目传送门 解题思路: 01背包. AC代码: #include<iostream> #include<cstdio> #include<vector> using ...
- Aduino Nano 技术性能指标
纵览 在Adnuino Nano网站上节选了该控制器的价格等,在中国买非常便宜,我用10元左右的人民币就买到了这个产品,在Arduino网站上的价格是22美金,还不包括税.这种差别是如何造成的?是国外 ...
- 3 react 简书 添加 头部搜索动态效果
1. 添加动态效果组件 yarn add react-transition-group 2. 修改 src/common/header/index.js import React, {Componen ...
- BZOJ:1927: [Sdoi2010]星际竞速
题解:最小费用流+二分图模型: 左边表示出这个点,右边表示入这个点: #include<iostream> #include<cstdio> #include<cstri ...
- 一天一个设计模式——Strategy策略模式
一.模式说明 策略模式比较好理解,就是将程序中用到的算法整体的拿出来,并有多个不同版本的算法实现,在程序运行阶段,动态的决定使用哪个算法来解决问题. 举个实际的例子:排序算法的问题,假如我们的程序中需 ...
- SpringMVC:拦截器
SpringMVC:拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.开发者可以自己定义一些拦截器来实现特定的功能. 过 ...
- 提升Python编程效率的几种方法
前言 我们知道Python这门语言在运行速度上已经败给了许多别的语言(比如C, C++, Java, Golang....).但从一个开发者的角度来看Python是我最喜欢的语言,很大一部分原因在于其 ...