[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\)有了一条路径,就更新最小答案.这个过程就相当于 ...
随机推荐
- vue使用Vant UI中的swiper组件及传值
子组件SwiperBanner <!-- --> <template> <div class="swiper"> <van-swipe : ...
- POJ 1028:Web Navigation
Web Navigation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 30828 Accepted: 13821 ...
- 关于SI522替代FM17522和MFRC522的资料对比
以下是SI522与FM17522.MFRC522的对比参数: SI522是完全PIN对PIN软硬件兼容MFRC522.CV520.FM17522,另外我们可提供一对一技术支持解决客户所遇到的问题: 1 ...
- 17. react redux的中间件
1. redux 数据流程图 View 会派发一个 Action Action 通过 Dispatch 方法派发给 Store Store 接收到 Action 连同之前的 State 发给 Red ...
- h5-伸缩布局-小案例
1.伸缩布局案例1-基本页面布局 1.1.html <div class="layout"> <header></header> <mai ...
- Airflow 使用 Celery 时,如何添加 Celery 配置
背景 前段时间我选用了 Airflow 对 wms 进行数据归档,在运行一段时间后,经常发现会报以下错误: [-- ::,: WARNING/ForkPoolWorker-] Failed opera ...
- JSTL 运算符汇总
算术运算符 + . - . * . / (或 div )和 % (或 mod ) 关系运算符 == (或 eq ). != (或 ne ). < (或 lt ). > (或 gt ). ...
- spring boot集成mybatis(3) - mybatis generator 配置
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- c 转二进制
int nData = 1568;//转二进制 for (int i = sizeof(int) * 8 - 1; i >= 0; i--){ if ((nData >>i) &am ...
- centos通过yum安装php
1.添加php的yum软件仓库 sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm 2.安装php相关软件,执行过程中全部选择ye ...