新学的科技。设\(f(x)\)为选\(x\)条白色边的时候的最小生成树权值和,那么可以猜到它应该是一个下凸函数的形式。

如图,图中\(x\)坐标表示选的白色边条数,\(y\)坐标表示获得的权值,那么我们就可以把\(f(x)\)在这个图上大致表示出来。我们现在并不清除\(x\)和\(y\),所以可以二分一下和这个凸函数相切直线的斜率。设这个直线为\(y = kx + b\),那么对于一个固定的\(x\),截距最小的时候,就是与函数相切的时候嘛,也是答案最优的时候。

我们把这个直线转化成\(y - kx = b\)的形式。由于不清楚会选用几条边,所以可以提前给每一条白色边都减去一个\(k\),这样不管选几条边其影响都可以被直接统计。也就是说我们现在就可以忽略选几条边的问题直接去最小化截距\(b\)了。在最小化截距的同时我们对\(y\)的值和\(x\)的值做一个记录,这样就可以做出应该取用左区间还是右区间的判定啦。

#include <bits/stdc++.h>
using namespace std;const int N = 50000 + 5;
const int M = 100000 + 5;
#define pii pair <int, int>
#define mp(x,y) make_pair (x, y)struct Len {int u, v, w, c;void read () {cin >> u >> v >> w >> c;}bool operator < (Len rhs) const { return w == rhs.w ? c < rhs.c : w < rhs.w;}
}L[M];int n, m, k, fa[N];int find (int x) {return x == fa[x] ? x : fa[x] = find (fa[x]);
}pii Kruskal () {for (int i = 0; i < n; ++i) fa[i] = i;sort (L, L + m);int cnt = 0, ret = 0, wht = 0;for (int i = 0; i < m; ++i) {int fu = find (L[i].u);int fv = find (L[i].v);if (fu != fv) {cnt += 1;fa[fu] = fv;ret += L[i].w;wht += L[i].c == 0;}if (cnt == m - 1) break;}   return mp (wht, ret);
} signed main () {
//  freopen ("data.in", "r", stdin);cin >> n >> m >> k;for (int i = 0; i < m; ++i) {L[i].read ();}int l = -150, r = 150, ans = 0;while (l < r) {int mid = (l + r) >> 1;for (int i = 0; i < m; ++i) {if (L[i].c == 0) { // 白色 L[i].w -= mid;}} pii ret = Kruskal ();
//      cout << "l = " << l << " r = " << r << " mid = " << mid <<  " ret = (" << ret.first << ", " << ret.second << ")" << endl; if (ret.first >= k) {r = mid;ans = ret.second + mid * k;} else {l = mid + 1;}for (int i = 0; i < m; ++i) {if (L[i].c == 0) {L[i].w += mid;}}}
//  cout << l << " " << r << endl;cout << ans << endl;
}

转载于:https://www.cnblogs.com/maomao9173/p/10916587.html

Luogu P2619 [国家集训队2]Tree I 凸优化,wqs二分相关推荐

  1. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  2. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

  3. P2619 [国家集训队2]Tree I

    P2619 [国家集训队2]Tree I 链接 分析: 为了确定白边选入的数量,所以给白边加一个权值,二分这个值,然后最小生成树.可以发现白边的数量虽这个值的增大而减小,满足单调性. 有一个问题:如果 ...

  4. 洛谷P4383 [八省联考2018]林克卡特树lct(DP凸优化/wqs二分)

    题目描述 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一个叫做"LC ...

  5. dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)

    qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...

  6. [学习笔记]dp凸优化/wqs二分[八省联考2018]林克卡特树lct

    废话 很早就想学wqs二分,结果拖了好久.因为以前是看了几遍都没有懂..(太菜了 后来因为计划里凸优化的题(比如CF321E Ciel and Gondolas,CF739E Gosha is hun ...

  7. 洛谷P2619 [国家集训队]Tree I 题解

    洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...

  8. P2619 [国家集训队]Tree I(WQS二分/带权二分/最小生成树)

    P2619 [国家集训队]Tree I 给定一个n个点,m条边的无向图,每条边有一个颜色黑色或者白色,求解恰好有k条白色边的最小生成树. 那么看到恰好选择k个的最优性问题,我们可以利用WQS二分解决, ...

  9. luogu P2634 [国家集训队]聪聪可可 点分治

    luogu P2634 [国家集训队]聪聪可可 点分治 没啥难度,只需将路径取模,开桶,统计 d[0],d[1],d[2] 的值即可. ans = d[1]*d[2]*d[2]+d[0]*d[0] C ...

最新文章

  1. 涨姿势了!为什么Windows上面的软件都想把自己安装在C盘?
  2. 集成学习-Boosting集成学习算法AdaBoost
  3. 3 Redis 配置文件
  4. html、css 【珍藏】
  5. 腾讯也有“神盾局”?秀出“技术肌肉”就靠TA了……
  6. 软件工程学习进度第三周暨暑期学习进度之第三周汇总
  7. 银行家算法检测死锁c语言,[算法]操作系统进程调度与通信算法 Dijkstra银行家算法 C语言实现 | 李大仁博客...
  8. 动态规划实战4-leetcode 5.Longest Palindromic Substring
  9. networkx设置节点的大小_节点大小取决于NetworkX上的节点度
  10. 批处理清空文件夹内所有txt文件的内容
  11. Vue看板娘教程详细版
  12. “无纸化”乘机,二维码登机牌
  13. TypeScript介绍
  14. android调用java接口_java/Android 接口调用的几种写法
  15. sim卡iccid编辑软件_5G超级SIM卡 能握在自己手中的 才是最安全的
  16. 校园综合平台-微信小程序版(整整两个月暑假的成果啊 (•ิ_•ิ))
  17. mysql版网络验证自动发卡功能
  18. 恒生与中国信通院联合发布《证券行业分布式核心系统SRE运维白皮书》
  19. sharepoint 2010 获取讨论板话题的所有评论回复信息 Get all replies
  20. python爬虫携程酒店_携程酒店爬取分享

热门文章

  1. JVM(3):Java GC算法 垃圾收集器
  2. 编码练习——Java-5-接口、继承与多态
  3. 玩转Eclipse — 自动生成setter和getter方法
  4. 深度学习caffe的代码怎么读?
  5. ReLu(Rectified Linear Units)激活函数
  6. Windbg/KD驱动调试点滴–将平时调试的一些小方法共享给大家 --------- 转
  7. Codeforces Round #521 (Div.3)题解
  8. 类的继承定义一个computer类在此基础上派生出两个子类(继承与多态绑定)
  9. java实现遍历树形菜单方法——HibernateUtil实现
  10. Spark in meituan http://tech.meituan.com/spark-in-meituan.html