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分别表示点数,边数和需要的白色 ...
随机推荐
- .NET面试题系列(十三)Lucene底层原理
索引原理 全文检索技术由来已久,绝大多数都基于倒排索引来做,曾经也有过一些其他方案如文件指纹.倒排索引,顾名思义,它相反于一篇文章包含了哪些词,它从词出发,记载了这个词在哪些文档中出现过,由两部分组成 ...
- Python中的包ImportError
前言 Python中的包给我提供了很好的代码组织,相似的功能模块放在同一个包内,不仅代码结构清晰,而且调用起来也比较方便(可以用*导入) 但是,我们在刚开始使用Python包的时候总是会遇到导入错误& ...
- UDP网络程序,客户端和服务端交互原理
创建一个udp客户端程序的流程是简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实 ...
- kan
http://blog.csdn.net/yahohi/article/details/7427724 http://duanhengbin.iteye.com/blog/1706635 http:/ ...
- spfa算法----最短路
题目链接:https://cn.vjudge.net/contest/66569#problem/A 代码: vis数组代表是否还有用,首先初始化为0,首先第一个点入队列,标记为1,然后刚入队列的时候 ...
- c++动态库封装及调用(3、windows下动态库调用)
1.DLL的隐式调用 隐式链接采用静态加载的方式,比较简单,需要.h..lib..dll三件套.新建“控制台应用程序”或“空项目”.配置如下: 项目->属性->配置属性->VC++ ...
- caffe-win10-cifar10另
上一篇主要以bat形式实现了leveldb形式的cifar10,因为对于shell脚本不甚熟悉,所以这次专门利用.sh调用来实现lmdb形式的cifar10. 1.下载数据 同上一篇. 2.数据转换和 ...
- ubuntu 下 teamview 取消自动启动 autostart
sudo teamviewer daemon disable
- passwd: Have exhausted maximum number of retries for service【转】
使用命令passwd修改密码时,遇到如下问题: # echo 'utf8'|passwd zhangsan --stdin Changing password for user zhangsan. p ...
- 【bzoj2653】【middle】【主席树+二分答案】
Description 一个长度为 n 的序列 a ,设其排过序之后为 b ,其中位数定义为 b[n/2] ,其中 a,b 从 0 开始标号 , 除法取下整. 给你一个长度为 n 的序列 s .回答 ...