Solution -「国家集训队」「洛谷 P2619」Tree I
\(\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的更多相关文章
- P4827「国家集训队」 Crash 的文明世界
		
「国家集训队」 Crash 的文明世界 提供一种不需要脑子的方法. 其实是看洛谷讨论版看出来的( (但是全网也就这一篇这个方法的题解了) 首先这是一个关于树上路径的问题,我们可以无脑上点分治. 考虑当 ...
 - 「国家集训队」middle
		
「国家集训队」middle 传送门 按照中位数题的套路,二分答案 \(mid\),序列中 \(\ge mid\) 记为 \(1\),\(< mid\) 的记为 \(-1\) 然后只要存在一个区间 ...
 - 「国家集训队」小Z的袜子
		
「国家集训队」小Z的袜子 传送门 莫队板子题. 注意计算答案的时候,由于分子分母都要除以2,所以可以直接约掉,这样在开桶算的时候也方便一些. 参考代码: #include <algorithm& ...
 - 「区间DP」「洛谷P1043」数字游戏
		
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
 - 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】
		
题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...
 - Solution -「JSOI 2019」「洛谷 P5334」节日庆典
		
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
 - Solution -「洛谷 P4372」Out of Sorts P
		
\(\mathcal{Description}\) OurOJ & 洛谷 P4372(几乎一致) 设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...
 - Solution -「POI 2010」「洛谷 P3511」MOS-Bridges
		
\(\mathcal{Description}\) Link.(洛谷上这翻译真的一言难尽呐. 给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...
 - Solution -「APIO 2016」「洛谷 P3643」划艇
		
\(\mathcal{Description}\) Link & 双倍经验. 给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...
 
随机推荐
- C# winform 遍历所有页面的所有控件 ,然后判断组件类型是什么
			
//循环整个form上的控件 foreach (Control c in this.Controls) { //看看是不是checkbox if (c is CheckBox) { //将找到的con ...
 - js实现工具函数中groupBy数据分组
			
数据 this.tableData = [ {id: 1, name: '测试', number: 1, price: 0}, {id: 2, name: '测试', number: 1, price ...
 - icmpsh之icmp反弹shell
			
一,技术原理 向ping www.baidu.com时,本机会先向百度的服务器发送ICMP请求包,如果请求成功了,则百度服务器会回应ICMP的响应包 引用百度百科: ICMP(Internet Con ...
 - Anaconda3+CUDA10.1+CUDNN7.6+TensorFlow2.6安装(Ubuntu16)
			
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
 - 安装TestNG
			
1.启动Eclipse,选择"Help"-->'Install New Software' 2.在谈出的弹框中选择"Add" 3.在弹出的"Ad ...
 - HTTP协议层面绕过WAF
			
最近也是在一直看过waf相关的资料,本次主要是想写写HTTP协议层面过WAF的一些技巧,来与大家一同探讨 原理 给服务器发送payload数据包,使得waf无法识别出payload,当apache,t ...
 - JavaScript创建和获取时间的方法
			
一.获取时间常用方法 1.创建时间对象 var time=new Date() //创建当前的时间信息对象 var time1=new Date(2022,1,1,10,25,30) //创建2022 ...
 - golang中的并发安全和锁
			
1. 并发安全 package main import ( "fmt" "sync" ) var ( sum int wg sync.WaitGroup ) f ...
 - Go 函数,包(二)
			
#### Go 函数,包(二)***百丈峰,松如浪,地势坤,厚德载物之像*** 今天又到周五啦,你们有没有激动呢,反正我很激动,又有两天的自由了; 上一节我们学习了Go 的函数和包的一些知识 , 今天 ...
 - java秒杀系列(1)- 秒杀方案总体思路
			
前言 首先,要明确一点,高并发场景下系统的瓶颈出现在哪里,其实主要就是数据库,那么就要想办法为数据库做层层防护,减轻数据库的压力. 一.简单图示 我用一个比较简单直观的图来表达大概的处理思路 二.生产 ...