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)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...
随机推荐
- 硬核 - Java 随机数相关 API 的演进与思考(下)
本系列将 Java 17 之前的随机数 API 以及 Java 17 之后的统一 API 都做了比较详细的说明,并且将随机数的特性以及实现思路也做了一些简单的分析,帮助大家明白为何会有这么多的随机数算 ...
- HDU 1754 I Hate It(线段数-单点更新)
原题链接:I Hate It 题目分析:这个是线段树的基本操作--更新和查询,属于基础题,也就相当于一个模板吧,这里就不再多说了. 代码如下:(PS:特别注意--输入输出用 不然会超时) #incl ...
- Whitelabel Error Page错误原因
前言: 今天在做项目中遇到了一个问题,项目启动成功,但是前段访问接口始终访问不成功,页面一直在404,百度了一番无非两种解决方案: 一.解决方案 1.项目是boot项目查看启动类的位置是否放置正确 要 ...
- 【Java】final
final final可以用来修饰的结构:类.方法.变量 final 用来修饰一个类:此类不能被其他类所继承. 比如:String类.System类.StringBuffer类 final 用来修饰方 ...
- RHCSA 第四天
1.使用whereis 查找 locate命令 使用which查找whereis命令 使用locate查找rm命令 2.find命令使用: 使用find命令在当前路径下查找所有的普通文件 使用f ...
- rocketmq学习之-基本样例
1 基本样例 在基本样例中我们提供如下的功能场景: 使用RocketMQ发送三种类型的消息:同步消息.异步消息和单向消息.其中前两种消息是可靠的,因为会有发送是否成功的应答. 使用RocketMQ来消 ...
- JavaScript创建和获取时间的方法
一.获取时间常用方法 1.创建时间对象 var time=new Date() //创建当前的时间信息对象 var time1=new Date(2022,1,1,10,25,30) //创建2022 ...
- C# app.config 保存和读取例子
保存: Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); if ...
- 【C++】自定义数据类型
自定义数据类型 标签:c++ 目录 自定义数据类型 一.结构体 定义方法: 特点: 成员访问方式: 初始化: 结构数组 指针和动态内存分配: 结构变量作为函数参数: 二.联合 定义方法: 特点: 举例 ...
- 【刷题-PAT】A1111 Online Map (30 分)
1111 Online Map (30 分) Input our current position and a destination, an online map can recommend sev ...