题解:

老早看的并没有写

wqs二分的原理和这个凸函数的性质已经证明过了

写的时候

主要的问题在于每次的答案是一个范围

什么意思呢

其实比较简单的做法是

优先取白边,优先取黑边做两次

然后看一下要求的在不在中间就可以了

但是这样有两倍的常数

所以我们换个处理的方法

就是我们优先处理黑边

然后只有答案<=要求的时候更新答案

由于一定有解,所以最后一次更新一定满足要求

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define IL inline
  4. #define rint register int
  5. #define rep(i,h,t) for (int i=h;i<=t;i++)
  6. #define dep(i,t,h) for(int i=t;i>=h;i--)
  7. char ss[<<],*A=ss,*B=ss;
  8. IL char gc()
  9. {
  10. return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
  11. }
  12. template<class T>void read(T &x)
  13. {
  14. rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=c^;
  15. while (c=gc(),<c&&c<) x=(x<<)+(x<<)+(c^); x*=f;
  16. }
  17. const int N=2e5;
  18. struct re{
  19. int a,b,c,d;
  20. }a[N],b[N];
  21. int n,m,k,fa[N],ans;
  22. bool cmp(re x,re y)
  23. {
  24. return(x.c<y.c||((x.c==y.c)&&(x.d>y.d)));
  25. }
  26. int find(int x)
  27. {
  28. return x==fa[x]?x:fa[x]=find(fa[x]);
  29. }
  30. int check(int x)
  31. {
  32. rep(i,,m)
  33. {
  34. if (!a[i].d) b[i].c=a[i].c+x;
  35. else b[i].c=a[i].c;
  36. b[i].a=a[i].a;
  37. b[i].b=a[i].b;
  38. b[i].d=a[i].d;
  39. }
  40. sort(b+,b+m+,cmp);
  41. ans=;
  42. rep(i,,n) fa[i]=i;
  43. int cnt=,cnt2=;
  44. rep(i,,m)
  45. {
  46. int x1=find(b[i].a),x2=find(b[i].b);
  47. if (x1!=x2)
  48. {
  49. if (!b[i].d) cnt2++;
  50. ans+=b[i].c;
  51. fa[x1]=x2;
  52. }
  53. }
  54. return(cnt2);
  55. }
  56. int main()
  57. {
  58. freopen("5.in","r",stdin);
  59. freopen("5.out","w",stdout);
  60. ios::sync_with_stdio(false);
  61. cin>>n>>m>>k;
  62. for(int i=;i<=m;i++)
  63. {
  64. cin>>a[i].a>>a[i].b>>a[i].c>>a[i].d;
  65. a[i].a++; a[i].b++;
  66. }
  67. int h=-,t=;
  68. int ans2=1e8;
  69. while (h<=t)
  70. {
  71. int mid=(h+t)/;
  72. int xx=check(mid);
  73. if (xx>k) h=mid+;
  74. else t=mid-,ans2=ans-mid*k;
  75. }
  76. printf("%d",ans2);
  77. return ;
  78. }

bzoj2654的更多相关文章

  1. 【bzoj2654】 tree

    http://www.lydsy.com/JudgeOnline/problem.php?id=2654 (题目链接) 题意 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有nee ...

  2. 【BZOJ2654】Tree(凸优化,最小生成树)

    [BZOJ2654]Tree(凸优化,最小生成树) 题面 BZOJ 洛谷 题解 这道题目是之前\(Apio\)的时候写的,忽然发现自己忘记发博客了... 这个万一就是一个凸优化, 给所有白边二分一个额 ...

  3. 【BZOJ2654】tree 二分+最小生成树

    [BZOJ2654]tree Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need ...

  4. [bzoj2654]tree_二分_kruskal

    tree bzoj-2654 题目大意:给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. 注释:$1\le V\le 5\cdot 10^4 ...

  5. 「BZOJ2654」tree

    「BZOJ2654」tree 最小生成树+二分答案. 最开始并没有觉得可以二分答案,因为答案并不单调啊. 其实根据题意,白边的数目肯定大于need条,而最小生成树的白边数并不等于need(废话),可以 ...

  6. 2021.07.19 BZOJ2654 tree(生成树)

    2021.07.19 BZOJ2654 tree(生成树) tree - 黑暗爆炸 2654 - Virtual Judge (vjudge.net) 重点: 1.生成树的本质 2.二分 题意: 有一 ...

  7. [BZOJ2654]tree(二分+MST)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2654 分析:此题很奇葩,我们可以给所有白边加上一个权值mid,那么在求得的MST中白边 ...

  8. BZOJ2654 tree

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

  9. [BZOJ2654] tree (kruskal & 二分答案)

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

随机推荐

  1. .NET面试题系列(十三)Lucene底层原理

    索引原理 全文检索技术由来已久,绝大多数都基于倒排索引来做,曾经也有过一些其他方案如文件指纹.倒排索引,顾名思义,它相反于一篇文章包含了哪些词,它从词出发,记载了这个词在哪些文档中出现过,由两部分组成 ...

  2. Python中的包ImportError

    前言 Python中的包给我提供了很好的代码组织,相似的功能模块放在同一个包内,不仅代码结构清晰,而且调用起来也比较方便(可以用*导入) 但是,我们在刚开始使用Python包的时候总是会遇到导入错误& ...

  3. UDP网络程序,客户端和服务端交互原理

    创建一个udp客户端程序的流程是简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实 ...

  4. kan

    http://blog.csdn.net/yahohi/article/details/7427724 http://duanhengbin.iteye.com/blog/1706635 http:/ ...

  5. spfa算法----最短路

    题目链接:https://cn.vjudge.net/contest/66569#problem/A 代码: vis数组代表是否还有用,首先初始化为0,首先第一个点入队列,标记为1,然后刚入队列的时候 ...

  6. c++动态库封装及调用(3、windows下动态库调用)

    1.DLL的隐式调用 隐式链接采用静态加载的方式,比较简单,需要.h..lib..dll三件套.新建“控制台应用程序”或“空项目”.配置如下: 项目->属性->配置属性->VC++ ...

  7. caffe-win10-cifar10另

    上一篇主要以bat形式实现了leveldb形式的cifar10,因为对于shell脚本不甚熟悉,所以这次专门利用.sh调用来实现lmdb形式的cifar10. 1.下载数据 同上一篇. 2.数据转换和 ...

  8. ubuntu 下 teamview 取消自动启动 autostart

    sudo teamviewer daemon disable

  9. passwd: Have exhausted maximum number of retries for service【转】

    使用命令passwd修改密码时,遇到如下问题: # echo 'utf8'|passwd zhangsan --stdin Changing password for user zhangsan. p ...

  10. 【bzoj2653】【middle】【主席树+二分答案】

    Description 一个长度为 n 的序列 a ,设其排过序之后为 b ,其中位数定义为 b[n/2] ,其中 a,b 从 0 开始标号 , 除法取下整. 给你一个长度为 n 的序列 s .回答 ...