本思路仅供参考,数据强一点应该该会被卡。

本蒟蒻没有打 \(link\) - \(cut\) - \(tree\) .

而是用暴力水了过去。

具体思路很简单,先二分最少的 \(a_i\) , 再在 \(judge\) 的时候再二分 \(b_i\).

然后使用并查集来判断是否联通,复杂度 \(n(logn)^3\)

但是第一遍只有 \(75\) 分 , 于是我写了两遍二分套二分,即先是以 \(a_i\) 为第一个二分的,然后再以 \(b_i\) 为第一个二分的,最后两者取较小的答案。

然后... 就 \(AC\) 了。

暴力真的是个美妙的东西。

Code :

#include<bits/stdc++.h>
#define in(x) x=read()
#define N 50008
#define M 100008 using namespace std;
struct sj{int y,x,a,b;}a[M*2];
int n,m,ans_A=M*2,ans_B=M*2,fa[N];
int Ans_A=M*2,Ans_B=M*2,Fa[N]; int read()
{
char ch=getchar(); int f=1,w=0;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
return f*w;
} int find(int x){
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
} void join(int x,int y){
x=find(x); y=find(y);
if(x!=y)fa[x]=y;
} bool jud(int A,int B)
{
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
if(a[i].a<=A&&a[i].b<=B)
join(a[i].x,a[i].y);
if(find(1)==find(n))return 1;
return 0;
} bool solve(int A)
{
int L=0,R=N*2,ans=-1;
while(L<=R)
{
int B=L+R>>1;
if(jud(A,B))
ans=B,R=B-1;
else L=B+1;
}
if(ans==-1)return 0;
if(ans_A+ans_B>A+ans)
ans_A=A,ans_B=ans;
return 1;
} bool Jud(int A,int B)
{
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
if(a[i].b<=A&&a[i].a<=B)
join(a[i].x,a[i].y);
if(find(1)==find(n))return 1;
return 0;
} bool Solve(int A)
{
int L=0,R=N*2,ans=-1;
while(L<=R)
{
int B=L+R>>1;
if(Jud(A,B))
ans=B,R=B-1;
else L=B+1;
}
if(ans==-1)return 0;
if(Ans_A+Ans_B>A+ans)
Ans_A=A,Ans_B=ans;
return 1;
} int main()
{
//freopen("disanti.in","r",stdin);
//freopen("disanti.out","w",stdout);
in(n); in(m);
for(int i=1;i<=m;i++)
in(a[i].x),in(a[i].y),
in(a[i].a),in(a[i].b);
int l=0,r=N*2;
while(l<=r)
{
int mid=l+r>>1;
if(solve(mid))r=mid-1;
else l=mid+1;
} l=0,r=N*2;
while(l<=r)
{
int mid=l+r>>1;
if(Solve(mid))r=mid-1;
else l=mid+1;
} if(ans_A==M*2&&ans_B==M*2)puts("-1");
else cout<<min(Ans_A+Ans_B,ans_A+ans_B)<<endl;
return 0;
}

[NOI2014] 魔法森林 (二分答案,并查集)的更多相关文章

  1. [HNOI2006]公路修建问题 (二分答案,并查集)

    题目链接 Solution 二分答案+并查集. 由于考虑到是要求花费的最小值,直接考虑到二分. 然后对于每一个二分出来的答案,模拟 \(Kruskal\) 的过程再做一遍连边. 同时用并查集维护联通块 ...

  2. 洛谷P1991无线通讯网[kruskal | 二分答案 并查集]

    题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...

  3. BZOJ 1196 [HNOI2006]公路修建问题(二分答案+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1196 [题目大意] 对于每条可能维修的公路可选择修一级公路或者二级公路,价值不同 要求 ...

  4. HDU-3081-Marriage Match 2(最大流, 二分答案, 并查集)

    链接: https://vjudge.net/problem/HDU-3081 题意: Presumably, you all have known the question of stable ma ...

  5. 【BZOJ1594】[Usaco2008 Jan]猜数游戏 二分答案+并查集

    [BZOJ1594][Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在 ...

  6. [luoguP2387] 魔法森林(LCT + 并查集)

    传送门 并查集真是一个判断连通的好东西! 连通性用并查集来搞. 把每一条边按照 a 为关键字从小到大排序. 那么直接枚举,动态维护 b 的最小生成树 用 a[i] + 1 ~ n 路径上最大的 b[i ...

  7. poj-3657 Haybale Guessing(二分答案+并查集)

    http://poj.org/problem?id=3657 下方有中文版,不想看英文的可直接点这里看中文版题目 Description The cows, who always have an in ...

  8. HNOI2006-公路修建问题(二分答案+并查集)

    公路修建问题 OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织成立了,旨 ...

  9. BZOJ 1196 二分答案+并查集

    http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题目大意:n个城市,m-1条路,每条路有一级公路和二级公路之分,你要造n-1条路,一级公路至少 ...

随机推荐

  1. delphi备份恢复剪切板

    http://blog.csdn.net/youthon/article/details/7327776 delphi备份恢复剪切板         分类:            Delphi编程20 ...

  2. struts2 token 防止表单重复提交

    1.jsp页面  输入框,提交按钮 <%@ page language="java" contentType="text/html" pageEncodi ...

  3. ssm项目的创建思路

    ·DAO层: 代码:pojo.映射文件.接口文件——Mybatis逆向工程自动生成 配置:ApplicationContext-dao.xml——数据源.连接池.会话工厂.mapper包扫描 ·Ser ...

  4. 从新向你学习javase(第一天)

    1:阐述JDK和JRE之间区别 jdk(工具)>jre(运行环境)>jvm(虚拟机) 2: 能够使用常见的DOS命令 d:(进入D盘下),cd +路径(进入到当前路径),cd..(返回上一 ...

  5. 剑指offer--day10

    1.1 题目:二叉搜索树的后序遍历序列:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 1.2 思路: 以{ ...

  6. Js基本类型中常用的方法总结

    1.数组 push() -----> 向数组末尾添加新的数组项,参数为要添加的项,返回值是新数组的长度,原数组改变: pop() -----> 删除数组末尾的最后一项,参数无,返回值是删除 ...

  7. 12 (H5*) JS第二天 流程控制:顺序结构、分支结构、循环结构

    目录 1:一元运算符 2:流程控制 3:分支之if语句 4:分支之if-else语句 5:分支语句之三元运算符 6:if和else if语句 7:switch-case语句 8:while循环 9:d ...

  8. jdk下载安装后为什么要设置环境变量?

    因为电脑不知道javac这个命令是在C:\Program Files\JAVA\jdk1.8.0_65\bin的这个路径下面,所以我们要设置好环境变量,来让电脑知道其路径

  9. eclipse中常用的快捷键【开发常用到的】

    1.全部选中:Ctrl+A 2.剪切Ctrl+X.复制Ctrl+C.粘贴Ctrl+V.保存Ctrl+S 3.撤销Ctrl+Z.取消撤销Ctrl+Y 4.规范代码:Ctrl+Shift+F 5.将代码更 ...

  10. sql语句中【模糊查询like的使用】

    1.like的使用: 在数据库软件中进行测试时,书写的格式是: 比如: select * from fdx.dbo.[User] where 1=1 and name like '%'+'a'+'%' ...