思想基本同bzoj 2594,但是多了一步

首先我们发现这时的边有两个属性了,因此我们考虑先去掉其中一者的限制

我们把所有边按$a$大小排序,然后从小到大加入维护的最小生成树

每次加边时都按照$b$的大小操作bzoj 2594,然后更新答案即可

如果始终不联通输出-1

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
using namespace std;
struct Ques
{
int x,y,typ,num;
}q[1000005];
struct Edge
{
int l,r,v1,v2;
friend bool operator < (Edge a,Edge b)
{
return a.v1==b.v1?a.v2<b.v2:a.v1<b.v1;
}
}edge[1000005];
map <pair<int,int>,int> M;
int n,m,Q;
int ch[2000005][2];
int vis[2000005];
int maxx[2000005];
int val[2000005];
int f[2000005];
int fl[2000005];
int ret[2000005];
void update(int x)
{
maxx[x]=val[x];
if(edge[maxx[ch[x][0]]].v2>edge[maxx[x]].v2)maxx[x]=maxx[ch[x][0]];
if(edge[maxx[ch[x][1]]].v2>edge[maxx[x]].v2)maxx[x]=maxx[ch[x][1]];
}
bool be_root(int x)
{
if(ch[f[x]][0]==x||ch[f[x]][1]==x)return 0;
return 1;
}
void pushdown(int x)
{
if(fl[x])
{
swap(ch[ch[x][0]][0],ch[ch[x][0]][1]);
swap(ch[ch[x][1]][0],ch[ch[x][1]][1]);
fl[ch[x][0]]^=1,fl[ch[x][1]]^=1;
fl[x]=0;
}
}
void repush(int x)
{
if(!be_root(x))repush(f[x]);
pushdown(x);
}
void rotate(int x)
{
int y=f[x],z=f[y],k=(ch[y][1]==x);
if(!be_root(y))ch[z][ch[z][1]==y]=x;
f[x]=z;
ch[y][k]=ch[x][!k],f[ch[x][!k]]=y;
ch[x][!k]=y,f[y]=x;
update(y),update(x);
}
void splay(int x)
{
repush(x);
while(!be_root(x)&&x)
{
int y=f[x],z=f[y];
if(!be_root(y)&&y)
{
if((ch[y][1]==x)^(ch[z][1]==y))rotate(x);
else rotate(y);
}
rotate(x);
}
update(x);
}
void access(int x)
{
int y=0;
while(x)
{
splay(x);
ch[x][1]=y;
update(x);
y=x,x=f[x];
}
}
void makeroot(int x)
{
access(x),splay(x);
swap(ch[x][0],ch[x][1]),fl[x]^=1;
}
void link(int x,int y)
{
makeroot(x);
f[x]=y;
}
void split(int x,int y)
{
makeroot(x),access(y),splay(y);
}
void cut(int x,int y)
{
split(x,y),ch[y][0]=f[x]=0,update(y);
}
int findf(int x)
{
access(x),splay(x),pushdown(x);
while(ch[x][0])x=ch[x][0],pushdown(x);
return x;
}
inline int read()
{
int f=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=m;i++)
{
edge[i].l=read(),edge[i].r=read(),edge[i].v1=read(),edge[i].v2=read();
if(edge[i].l>edge[i].r)swap(edge[i].l,edge[i].r);
}
sort(edge+1,edge+m+1);
int ans=0x3f3f3f3f;
for(int i=1;i<=m;i++)val[i+n]=maxx[i+n]=i;
for(int i=1;i<=m;i++)
{
int f1=findf(edge[i].l),f2=findf(edge[i].r);
if(f1==f2)
{
split(edge[i].l,edge[i].r);
if(edge[maxx[edge[i].r]].v2>edge[i].v2)
{
int t=maxx[edge[i].r];
cut(edge[t].l,t+n),cut(edge[t].r,t+n);
link(edge[i].l,i+n),link(edge[i].r,i+n);
}
}else link(edge[i].l,i+n),link(edge[i].r,i+n);
int ff1=findf(1),ff2=findf(n);
if(ff1==ff2)
{
split(1,n);
ans=min(ans,edge[i].v1+edge[maxx[n]].v2);
}
}
if(ans==0x3f3f3f3f)printf("-1\n");
else printf("%d\n",ans);
return 0;
}

bzoj 3669的更多相关文章

  1. [BZOJ 3669] [Noi2014] 魔法森林 【LCT】

    题目链接:BZOJ - 3669 题目分析 如果确定了带 x 只精灵A,那么我们就是要找一条 1 到 n 的路径,满足只经过 Ai <= x 的边,而且要使经过的边中最大的 Bi 尽量小. 其实 ...

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

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

  3. bzoj 3669: [Noi2014]魔法森林 动态树

    3669: [Noi2014]魔法森林 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 363  Solved: 202[Submit][Status] ...

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

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

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

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

  6. bzoj 3669 lct维护最小生成树

    大概题意:给一个无向图,有a,b两种边权,找一条从1到n的路径,使得max(a[i])+max(b[i])最小a[i],b[i]表示该路径上的边的对应权. 如果用类似最短路的DP来做,显然每个点的状态 ...

  7. bzoj 3669: [Noi2014]魔法森林 -- 动点spfa

    3669: [Noi2014]魔法森林 Time Limit: 30 Sec  Memory Limit: 512 MB 动点spfa Description 为了得到书法大家的真传,小E同学下定决心 ...

  8. 【BZOJ 3669】 3669: [Noi2014]魔法森林 (动态spfa)

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

  9. BZOJ 3669 [Noi2014]魔法森林(贪心+LCT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3669 [题目大意] 给出一张图,每条边上有两个值ai和bi,现在需要求出一条1到N的路 ...

  10. 洛谷 2387/BZOJ 3669 魔法森林

    3669: [Noi2014]魔法森林 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 3765  Solved: 2402[Submit][Statu ...

随机推荐

  1. 24js Number(数字)对象

    <!DOCTYPE html> <html lang="en">   <head>     <meta charset="UTF ...

  2. C语言II博客作业04

    C语言II-作业04 作业头 这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/SE2020-2/?page=2 这个作业要求在哪里 https://ed ...

  3. 直播平台搭建源码,canvas 画一条波浪线 进度条

    直播平台搭建源码,canvas 画一条波浪线 进度条 <template>  <view>    <canvas :style="{'width': width ...

  4. Day22:数据库导入&分工&准备科研训练

    今日完成的任务: 1.与组员共同排查jar包中的问题,发现是由于未导入数据库. 网上查询后在MySQL workbench中完成了导入导出(图中user数据库). 2.完成实验报告分工,我负责结论部分 ...

  5. 掌控安全学院SQL注入靶场-布尔盲注(一)

    靶场地址:http://inject2.lab.aqlab.cn/Pass-10/index.php?id=1 判断注入点: http://inject2.lab.aqlab.cn/Pass-10/i ...

  6. undefined reference to symbol xxxxx和undefined symbol:xxxx错误的原因分析以及解决方法

    Linux下编译程序时,经常会遇到"undefined reference to XXX" 报错,或者运行时出现undefined symbol:xxxx报错. 这里总结一些可能的 ...

  7. 关闭win10“快速启动”功能

    windows正常运行时间的统计问题 windows任务管理器中,在性能选项卡中可以查看系统的运行时间(开机时间) 正常情况下,如果电脑关机,那么再次开机后,该时间会被重置 但是,如果电脑处于上面所说 ...

  8. 《计算机是怎么跑起来的》第十章 XML(可扩展标记语言)

    资料来源 (1) <计算机是怎么跑起来的> 注1:XML是Extensible Markup Language(可扩展标记语言)的缩写; 1.XML是标记语言 (1) 通常把通过添加标签为 ...

  9. 【git】2.5远程仓库的使用

    资料来源 (1) https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93% ...

  10. 蓝桥杯训练赛二-1169 问题 D: 绝对值排序

    题目描述 输入n(n<=100)个整数,按照绝对值从大到小排序后输出.题目保证对于每一个测试实例,所有的数的绝对值都不相等. 输入 输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整 ...