\(\mathcal{Description}\)

  Link.

  给一个 \(n\) 个点 \(m\) 条边的带权无向图,边有权值和黑白颜色,求恰选出 \(K\) 条白边构成的最小生成树。

  \(n\le5\times10^4\),\(m\le10^5\)。

\(\mathcal{Solution}\)

  沉迷造题,好久没写题解了 qwq。

  本题是 WQS 二分的板题。记 \(f(x)\) 表示恰选 \(x\) 条白边构成的最小生成树,不难发现 \((x,f(x))\) 在坐标轴上构成下凸包。而 WQS 二分本质上是用一个一次函数切这个未知的凸包,判断切点横坐标与给定的 \(K\) 的大小关系调整二分斜率,继而求到最终答案。

  具体可以看 @CreeperLKF 大佬的这篇博客

  实现上,可以分别用 std::vector 存黑边和白边,跑 Kruskal 的时候用两个指针类似归并排序地扫,就能去掉排序的 \(\log\) 了。记边权上限 \(w\),复杂度 \(\mathcal O(m(\log m+\log w))\)。

\(\mathcal{Code}\)

#include <cstdio>
#include <vector>
#include <algorithm> const int MAXN = 5e4;
int n, m, K; struct Edge {
int u, v, w;
inline bool operator < ( const Edge t ) const { return w < t.w; }
};
std::vector<Edge> W, B; struct DSU {
int fa[MAXN + 5];
inline void init ( const int n ) { for ( int i = 1; i <= n; ++ i ) fa[i] = i; }
inline int find ( const int x ) { return x ^ fa[x] ? fa[x] = find ( fa[x] ) : x; }
inline bool unite ( int x, int y ) {
x = find ( x ), y = find ( y );
return x ^ y ? fa[x] = y, true : false;
}
} dsu; inline int Kruskal ( const int mid, int& wuse ) {
int ret = wuse = 0; dsu.init ( n );
for ( int i = 0, j = 0, cnt = 0; cnt < n - 1; ) {
if ( j == ( int ) B.size () || ( i ^ W.size () && W[i].w + mid <= B[j].w ) ) {
if ( dsu.unite ( W[i].u, W[i].v ) ) ret += W[i].w + mid, ++ wuse, ++ cnt;
++ i;
} else {
if ( dsu.unite ( B[j].u, B[j].v ) ) ret += B[j].w, ++ cnt;
++ j;
}
}
return ret;
} int main () {
scanf ( "%d %d %d", &n, &m, &K );
for ( int i = 1, u, v, w, c; i <= m; ++ i ) {
scanf ( "%d %d %d %d", &u, &v, &w, &c );
++ u, ++ v;
if ( ! c ) W.push_back ( { u, v, w } );
else B.push_back ( { u, v, w } );
}
std::sort ( W.begin (), W.end () );
std::sort ( B.begin (), B.end () );
int l = -100, r = 100, ans = -1;
while ( l <= r ) {
int mid = l + r >> 1, curs, curw;
curs = Kruskal ( mid, curw );
if ( curw >= K ) l = mid + 1, ans = curs - mid * K;
else r = mid - 1;
}
printf ( "%d\n", ans );
return 0;
}

Solution -「国家集训队」「洛谷 P2619」Tree I的更多相关文章

  1. P4827「国家集训队」 Crash 的文明世界

    「国家集训队」 Crash 的文明世界 提供一种不需要脑子的方法. 其实是看洛谷讨论版看出来的( (但是全网也就这一篇这个方法的题解了) 首先这是一个关于树上路径的问题,我们可以无脑上点分治. 考虑当 ...

  2. 「国家集训队」middle

    「国家集训队」middle 传送门 按照中位数题的套路,二分答案 \(mid\),序列中 \(\ge mid\) 记为 \(1\),\(< mid\) 的记为 \(-1\) 然后只要存在一个区间 ...

  3. 「国家集训队」小Z的袜子

    「国家集训队」小Z的袜子 传送门 莫队板子题. 注意计算答案的时候,由于分子分母都要除以2,所以可以直接约掉,这样在开桶算的时候也方便一些. 参考代码: #include <algorithm& ...

  4. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  5. 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】

    题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...

  6. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  7. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  8. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  9. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

随机推荐

  1. nvm切换node版本出现乱码 exit status 1:

    nvm切换nodejs版本出现exit status 1:乱码 跟着网上的教程一步一步做,还是出现问题.浪费一下午的时间 最后发现却因为我没用CMD管理员权限运行 扑街 解决方法: 用管理员身份运行就 ...

  2. Golang中Label的用法

    在Golang中能使用Label的有goto, break, continue.,这篇文章就介绍下Golang中Label使用和注意点. 注意点: Label在continue, break中是可选的 ...

  3. Protobuf使用--go和C#

    一.Go安装及使用protobuf工具 以下都是基于Linux系统: 1.安装 A) protobuf 编译工具安装 1.下载 protoBuf: cd $GOPATH/src/ git clone ...

  4. 机器学习&恶意代码检测简介

    Malware detection 目录 可执行文件简介 检测方法概述 资源及参考文献 可执行文件简介 ELF(Executable Linkable Format) linux下的可执行文件格式,按 ...

  5. ASCII、Unicode和UTF-8等常见字符编码格式介绍

    信息存储在计算机中是转换成二进制来存储的,二进制的发明据说是来源于中国阴阳八卦.后德国数理哲学大师莱布尼茨是最早接触中华文化的欧洲人之一,从他的传教士朋友鲍威特寄给他的拉丁文译本<易经>中 ...

  6. Python常用的数据结构

    一.list 列表 1.列表的特点 有序的,元素可以重复,列表中的元素可以进行增上改查,可以存放不同的数据类型 2.创建列表 中括号创建并填充 --->[] 通过构造函数创建 list() 列表 ...

  7. 【reverse】逆向2 寄存器与内存

    [reverse]逆向2 寄存器与内存 1.通用寄存器 主要用途其实没必要记下来,因为只是CPU建议你这么做. 寄存器需要按照顺序被下来 32位就是可以存32个0或1 所以存储范围就是0-0xFFFF ...

  8. 1012day-人口普查系统

    1.name.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...

  9. 华为matebook x pro监听耳机电流声

    问题 左耳出现电流声,播放声音就电流声,关闭声音10s后才消失 设备 matebook x pro2018 hd206耳机 原因 matebook设计缺陷充电电流声大,毕竟早期type C快充,监听耳 ...

  10. unity3d之public变量引发错误

    public变量引发错误 在vs ide中怎么更改也无效 后来发现public里面的值一直不改变,手动改之.