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

本蒟蒻没有打 \(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. GMSSL在Window下的编译

    因为工作需要用到SM2算法加解密,网络上找一圈,没有合用的,还被骗了一堆积分. 无奈只得自行编译,从GITHUB的GMSSL下载到最新的SSL库,VS2012下编译踩了不少坑,记录一下 GITHUB链 ...

  2. VGA时序及其原理(转载)

    显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信 ...

  3. 基于3ds Max的游戏建模方案

    前言 需求 由于本游戏的设计,需求使用到角色以及场景建模.具体模型的搭建与贴图的设计根据原画进行. 工具 一般在游戏研发中,模型的搭建主要使用以下工具和概念来渲染建模. 3ds Max 3ds Max ...

  4. day17跨文件夹导入模块,模块的两种被执行方式,包,直接使用包中模块,包的管理

    复习 ''' 1.模块 -- 一系列功能的集合体,用文件来管理一系列有联系的功能,该文件我们称之为模块,文件名就是模块名 -- import | from...import 来导入模块,从而使用模块中 ...

  5. 倾旋之slack主题协同

    源:https://pocketcorp.slack.com/join/shared_invite/enQtNTk2MDYwNDA4NzU0LTg3ZGVlNDE5NWUzNjJhZTc1MDQ5MT ...

  6. windows和linux中查看端口占用情况并kill掉对应进程

    好几次在不同的情况下遇到 需要查看端口信息 并且kill掉对应进程的情况 相关的参数总是记不全 在这里记录下 以后查看方便 windows中查看正在使用端口的信息netstat -ano|findst ...

  7. 多线程10-SemaphoreSlim

        );         ;i<=;i++)             {                  +  * i;                 ));             C ...

  8. <每日一题>Day 9:POJ-3281.Dining(拆点 + 多源多汇+ 网络流 )

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 24945   Accepted: 10985 Descript ...

  9. LCD应用程序测试

    #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl ...

  10. UI标签库专题十:JEECG智能开发平台 Form(form标签)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhangdaiscott/article/details/30099121  1. Form(f ...