[NOI2014] 魔法森林 (二分答案,并查集)
本思路仅供参考,数据强一点应该该会被卡。
本蒟蒻没有打 \(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] 魔法森林 (二分答案,并查集)的更多相关文章
- [HNOI2006]公路修建问题 (二分答案,并查集)
题目链接 Solution 二分答案+并查集. 由于考虑到是要求花费的最小值,直接考虑到二分. 然后对于每一个二分出来的答案,模拟 \(Kruskal\) 的过程再做一遍连边. 同时用并查集维护联通块 ...
- 洛谷P1991无线通讯网[kruskal | 二分答案 并查集]
题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...
- BZOJ 1196 [HNOI2006]公路修建问题(二分答案+并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1196 [题目大意] 对于每条可能维修的公路可选择修一级公路或者二级公路,价值不同 要求 ...
- HDU-3081-Marriage Match 2(最大流, 二分答案, 并查集)
链接: https://vjudge.net/problem/HDU-3081 题意: Presumably, you all have known the question of stable ma ...
- 【BZOJ1594】[Usaco2008 Jan]猜数游戏 二分答案+并查集
[BZOJ1594][Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在 ...
- [luoguP2387] 魔法森林(LCT + 并查集)
传送门 并查集真是一个判断连通的好东西! 连通性用并查集来搞. 把每一条边按照 a 为关键字从小到大排序. 那么直接枚举,动态维护 b 的最小生成树 用 a[i] + 1 ~ n 路径上最大的 b[i ...
- poj-3657 Haybale Guessing(二分答案+并查集)
http://poj.org/problem?id=3657 下方有中文版,不想看英文的可直接点这里看中文版题目 Description The cows, who always have an in ...
- HNOI2006-公路修建问题(二分答案+并查集)
公路修建问题 OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织成立了,旨 ...
- BZOJ 1196 二分答案+并查集
http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题目大意:n个城市,m-1条路,每条路有一级公路和二级公路之分,你要造n-1条路,一级公路至少 ...
随机推荐
- Delphi XE2 之 FireMonkey 入门(24) - 数据绑定: TBindingsList: TBindExpression.Direction
在学习 BindingSource 属性时, 可以让两个控件互为绑定源; TBindExpression 对应的功能是 Direction 属性. 先在窗体上添加 Edit1.Edit2.Bindin ...
- python接口自动化:对外接口sign签名
签名参数sign生成的方法: 在接口开发过程中,一般通过时间戳+sign作为密匙加密传输 实现代码如下: #python实现sign签名 import hashlib,time class sign: ...
- 子页面中ifram高度自使用
HTML: <iframe id="mainframe" name="mainframe" style="width: 100%; border ...
- oracle--本地网络配置tnsnames.ora和监听器listener.ora
文件tnsnames.ora 是给orcl客户端使用 配置本地网络服务:(客户端) 第一种使用暴力方式直接操作: 修改:C:\app\Administrator\product\11.2.0\dbho ...
- python基础-5.2装饰器
1.了解装饰器前准备 #### 第一波 #### def foo(): print 'foo' foo #表示是函数,仅指向了函数的地址,为执行 foo() #表示执行foo函数 #### 第二波 # ...
- JAVA总结--正则表达式
正则表达式定义: pattern 对象是一个正则表达式的编译表示.Matcher 对象是对输入字符串进行解释和匹配操作的引擎.PatternSyntaxException 是一个非强制异常类,它表示一 ...
- Super Mario HDU 4417 主席树区间查询
Super Mario HDU 4417 主席树区间查询 题意 给你n个数(编号从0开始),然后查询区间内小于k的数的个数. 解题思路 这个可以使用主席树来处理,因为这个很类似查询区间内的第k小的问题 ...
- impala删表,而hdfs上文件却还在异常处理
Impala/hive删除表,drop后,hdfs上文件却还在处理方法: 问题原因分析,如下如可以看出一个属组是hive,一个是impala,keberas账号登录hive用户无法删除impala用户 ...
- 通过设置代理解决AndroidStudio无法下载gradle问题
一.AndroidStudio代理 我们平时在使用android studio时,难免需要从android官网下载一些项目运行所需要的SDK文件,但是因为android官网在国外,访问起来会比较慢,所 ...
- [Vue warn]: You may have an infinite update loop in a component render function
[Vue warn]: You may have an infinite update loop in a component render function 这个问题很奇怪,之前从来没有遇到过.如果 ...