bzoj2654
题解:
老早看的并没有写
wqs二分的原理和这个凸函数的性质已经证明过了
写的时候
主要的问题在于每次的答案是一个范围
什么意思呢
其实比较简单的做法是
优先取白边,优先取黑边做两次
然后看一下要求的在不在中间就可以了
但是这样有两倍的常数
所以我们换个处理的方法
就是我们优先处理黑边
然后只有答案<=要求的时候更新答案
由于一定有解,所以最后一次更新一定满足要求
代码:
#include <bits/stdc++.h>
using namespace std;
#define IL inline
#define rint register int
#define rep(i,h,t) for (int i=h;i<=t;i++)
#define dep(i,t,h) for(int i=t;i>=h;i--)
char ss[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T>void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=c^;
while (c=gc(),<c&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
const int N=2e5;
struct re{
int a,b,c,d;
}a[N],b[N];
int n,m,k,fa[N],ans;
bool cmp(re x,re y)
{
return(x.c<y.c||((x.c==y.c)&&(x.d>y.d)));
}
int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int check(int x)
{
rep(i,,m)
{
if (!a[i].d) b[i].c=a[i].c+x;
else b[i].c=a[i].c;
b[i].a=a[i].a;
b[i].b=a[i].b;
b[i].d=a[i].d;
}
sort(b+,b+m+,cmp);
ans=;
rep(i,,n) fa[i]=i;
int cnt=,cnt2=;
rep(i,,m)
{
int x1=find(b[i].a),x2=find(b[i].b);
if (x1!=x2)
{
if (!b[i].d) cnt2++;
ans+=b[i].c;
fa[x1]=x2;
}
}
return(cnt2);
}
int main()
{
freopen("5.in","r",stdin);
freopen("5.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>m>>k;
for(int i=;i<=m;i++)
{
cin>>a[i].a>>a[i].b>>a[i].c>>a[i].d;
a[i].a++; a[i].b++;
}
int h=-,t=;
int ans2=1e8;
while (h<=t)
{
int mid=(h+t)/;
int xx=check(mid);
if (xx>k) h=mid+;
else t=mid-,ans2=ans-mid*k;
}
printf("%d",ans2);
return ;
}
bzoj2654的更多相关文章
- 【bzoj2654】 tree
http://www.lydsy.com/JudgeOnline/problem.php?id=2654 (题目链接) 题意 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有nee ...
- 【BZOJ2654】Tree(凸优化,最小生成树)
[BZOJ2654]Tree(凸优化,最小生成树) 题面 BZOJ 洛谷 题解 这道题目是之前\(Apio\)的时候写的,忽然发现自己忘记发博客了... 这个万一就是一个凸优化, 给所有白边二分一个额 ...
- 【BZOJ2654】tree 二分+最小生成树
[BZOJ2654]tree Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need ...
- [bzoj2654]tree_二分_kruskal
tree bzoj-2654 题目大意:给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. 注释:$1\le V\le 5\cdot 10^4 ...
- 「BZOJ2654」tree
「BZOJ2654」tree 最小生成树+二分答案. 最开始并没有觉得可以二分答案,因为答案并不单调啊. 其实根据题意,白边的数目肯定大于need条,而最小生成树的白边数并不等于need(废话),可以 ...
- 2021.07.19 BZOJ2654 tree(生成树)
2021.07.19 BZOJ2654 tree(生成树) tree - 黑暗爆炸 2654 - Virtual Judge (vjudge.net) 重点: 1.生成树的本质 2.二分 题意: 有一 ...
- [BZOJ2654]tree(二分+MST)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2654 分析:此题很奇葩,我们可以给所有白边加上一个权值mid,那么在求得的MST中白边 ...
- BZOJ2654 tree
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- [BZOJ2654] tree (kruskal & 二分答案)
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
随机推荐
- ZOJ 4019 Schrödinger's Knapsack
Schrödinger's Knapsack Time Limit: 1 Second Memory Limit: 65536 KB DreamGrid has a magical knap ...
- groovy.lang.GroovyRuntimeException: Conflicting module versions
在运行groovy的junit方法时,报了这个错误: java.lang.ExceptionInInitializerError at org.codehaus.groovy.reflection.C ...
- bzoj千题计划301:bzoj4259: 残缺的字符串
https://www.lydsy.com/JudgeOnline/problem.php?id=4259 令通配符=0 f[i+m-1]=Σ (a[i+j]-b[m-1-j])^2 * a[i+j] ...
- 转 -- Python: 多继承模式下 MRO(Method Resolution Order) 的计算方式关乎super
大家可能已经知道了,在 Python 3(Python 2 的新式类)中多继承模式是使用 C3 算法来确定 MRO(Method Resolution Order) 的. 那么具体是怎么计算的呢?本文 ...
- C 编译过程浅析
From where i stand, there are two programmig languages in the world, which is C lang and the other. ...
- android AsyncHttpClient使用
1.www.github.com下载jar包 loopj/android-async-http 将下载好的文件导入项目中 2.main.xml <?xml version="1.0&q ...
- MyBatis学习-入门
eclipse + jdk 1.8 + mybatis 1.数据库准备 安装mysql数据库,建立数据库test,在test库下建立测试的表 CREATE TABLE `t_user` ( `id` ...
- sqlite limit offset
limit 0,20 表示从第1条开始取20条数据 limit 20 offset 2 表示从第2条开始取出20条数据
- 用代码生成UINavigationController 与UITabBarController相结合的简单QQ框架(部分)
首先我们需要搭建一个空的项目,当然xcode6.0以后不支持直接创建空项目,所以我们需要在系统生成项目之后,删除xcode自动给你生成的控制器和storyboard,另外需要在Main Interfa ...
- 所有Windows7下游戏的全屏问题
Win键+R键,打开运行窗口,输入regedit 回车,这样就打开了注册表编辑器,然后,定位到以下位置:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\ ...