Luogu P2619 [国家集训队2]Tree I 凸优化,wqs二分
新学的科技。设\(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二分的更多相关文章
- luogu P2619 [国家集训队2]Tree I
题目链接 luogu P2619 [国家集训队2]Tree I 题解 普通思路就不说了二分增量,生成树check 说一下坑点 二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等 ...
- Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...
- 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)
洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...
- P2619 [国家集训队2]Tree I(最小生成树+二分)
P2619 [国家集训队2]Tree I 每次二分一个$x$,每条白边加上$x$,跑最小生成树 统计一下满足条件的最小值就好了. to me:注意二分不要写挂 #include<iostream ...
- 洛谷P4383 [八省联考2018]林克卡特树lct(DP凸优化/wqs二分)
题目描述 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一个叫做“LCT” 的挑 ...
- dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)
qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...
- P2619 [国家集训队2]Tree I
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- p2619 [国家集训队2]Tree I [wqs二分学习]
分析 https://www.cnblogs.com/CreeperLKF/p/9045491.html 反正这个博客看起来很nb就对了 但是不知道他在说啥 实际上wqs二分就是原来的值dp[x]表示 ...
- [国家集训队2012]tree(陈立杰) 题解(二分+最小生成树)
tree 时间限制: 3 Sec 内存限制: 512 MB 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入 第一行V, ...
随机推荐
- java:Mybatis框架1(基本配置,log4j,Junit4(单元测试))
1.mybatis01: db.properties: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test userna ...
- 报错:java.lang.NoClassDefFoundError: com/google/inject/Injector
使用testng report,导入jar包:reportng.jar和velocity-dep-1.4.jar后,执行脚本,报错如下: 缺少依赖的jar包:guice-4.0.jar 导入依赖的ja ...
- 关于FPS游戏的设计问题
第一个想到的问题: 首先以unity的FPSCharactorController为例,这里规定,相机的方向中心一定是瞄准的方向中心.设置身体的扭曲朝向相机方向,这样身体可以弯腰.你们看图中,我让玩家 ...
- 解一元二次方程的C++实现
一元二次方程的根的情况分为实根与虚根两种,代码如下 #include<iostream> #include<cmath> using namespace std; float ...
- excel常用公式--数据清洗类
trim:去除单元格两端的空格. concat/&:连接单元格内的内容. mid: 提取字符串中间的字符串. left: 提取字符串左边的字符串. right: 提取字符串右边的字符串. ...
- java期末考试
水仙花数 package txt; public class shuixianhua { public static void main(String[] args) { // TODO Auto-g ...
- nodejs版本控制:nvm use命令失效
Downloading npm version ... Download failed. Rolling Back. Rollback failed. remove C:\Users\Administ ...
- queue的常见用法
queue的使用 queue是什么? queue是一种先入先出的容器 queue的定义 引入 # include <iostream> # include <queue> us ...
- python中判断变量的类型
python的数据类型有:数字(int).浮点(float).字符串(str),列表(list).元组(tuple).字典(dict).集合(set) 一般通过以下方法进行判断: 1.isinstan ...
- Centos7 用gogs搭建git仓库
0.安装步骤 先安装依赖,然后创建数据库,创建git用户,安装Gogs软件,设置启动,访问web界面进行配置 一.Gogs依赖环境 安装Gogs之前需要配置相应的依赖环境,官网介绍的依赖环境如下: 数 ...