新学的科技。设\(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;
}

Luogu P2619 [国家集训队2]Tree I 凸优化,wqs二分的更多相关文章

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

    题目链接 luogu P2619 [国家集训队2]Tree I 题解 普通思路就不说了二分增量,生成树check 说一下坑点 二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等 ...

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

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

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

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

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

    P2619 [国家集训队2]Tree I 每次二分一个$x$,每条白边加上$x$,跑最小生成树 统计一下满足条件的最小值就好了. to me:注意二分不要写挂 #include<iostream ...

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

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

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

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

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

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

  8. p2619 [国家集训队2]Tree I [wqs二分学习]

    分析 https://www.cnblogs.com/CreeperLKF/p/9045491.html 反正这个博客看起来很nb就对了 但是不知道他在说啥 实际上wqs二分就是原来的值dp[x]表示 ...

  9. [国家集训队2012]tree(陈立杰) 题解(二分+最小生成树)

    tree 时间限制: 3 Sec  内存限制: 512 MB 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入 第一行V, ...

随机推荐

  1. JMeter5.0核心源码浅析[转]

    [转自:https://blog.csdn.net/zuozewei/article/details/85042829] 源码下载地址:https://github.com/apache/jmeter ...

  2. C# Selenium FireFox 接入阿布云

    业务需要购买http隧道,发现阿布云还行,使用Selenium本来想要用谷歌浏览器的,但是发现不能直接设置账号,所以选用火狐. 按照官方JAVA示例的改编,其中WebDriver实例化不能直接添加Fi ...

  3. 正确关闭selinux

    .查看当前selinux的状态命令为 getenforce .两个都要关.注意先看看有么有这两个文件,如果没有就创建一个,否则后期会出现很多问题 cat > /etc/selinux/confi ...

  4. MySQL orzdba、dodba、top、iostat、vmstat、perf等

    1 mysq自带的mysqladmin命令 mysqladmin -usystem -p*** -h127.0.0.1 -P3306 -r -i 1 extended-status \ |grep & ...

  5. 连接Xshell

    连xshell之前先进入[root@localhost zxj]# vim /etc/ssh/sshd_config, 将115行删除注释改为UseDNS  no, 保存重启sshd(xshell)的 ...

  6. 错误:expected initializer before "***"

    今天写了一个程序,编译时报了一个错误:expected initializer before "***"报错的语句只是程序开头的一个变量定义语句,怎么会有这样的错误呢,琢磨了半天也 ...

  7. python基本成分详解

    字符串 一.需要了解的 msg = 'HelloWorld' 1.isdecimal判断是否是十进制(整数)w print(msg.isdecimal()) 2.endswith判断字符串末尾是否是指 ...

  8. springboot - 应用实践(2)第一个springboot应用

    1.使用maven创建一个快速启动项目 2.引入相关依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:x ...

  9. 干货 | 深入分析 string.intern() 方法

    首先我们来看一段代码: public class InternTest {      public static void main(String[] args) {     String str1 ...

  10. IDEA Maven项目 pom.xml 找不到 Dependency 依赖

    转载: IDEA Maven项目 pom.xml 找不到 Dependency 依赖 如果你的pom.xml中使用了dependencyManagement管理依赖并且添加了你本地仓库中不存在的依赖可 ...