CF603E Pastoral Oddities 题解

news/2024/11/17 16:03:54/文章来源:https://www.cnblogs.com/Scarab/p/18550640

Description

给定一张 \(n\) 个点的无向图,初始没有边。

依次加入 \(m\) 条带权的边,每次加入后询问是否存在一个边集,满足每个点的度数均为奇数。

若存在,则还需要最小化边集中的最大边权。

\(n \le 10^5\)\(m \le 3 \times 10^5\)

Solution

考虑给定一个图,怎么判断这个图存在一个边集满足条件。

结论是这个图的每个连通块大小为偶数就合法,否则不合法。证明就考虑如果存在一个连通块大小为奇数,则这个连通块最终总度数一定为奇数,而显然加入一条边所有点的度数和奇偶性不变,仍为偶数,所以矛盾。

如果一个连通块大小为偶数,就随便拿出一个生成树,然后从叶子向根考虑。如果一个点儿子连过来的边有偶数个,这个点就连父亲,否则不连。剩下的根节点也一定满足条件。

所以如果固定边集的可选范围,只需要先对于边权从小到大排序,在加边的过程中维护奇连通块的个数即可。

但是如果需要动态加边,上面那个做法就没用了,因为你无法确定某一个时刻的连通块状态。

考虑线段树分治。

由于答案从后往前不降,所以第 \(i\) 条边在最优边集中存在的时间一定是一个以 \(i\) 为左端点区间。线段树分治时先分治右子树,再分治左子树,到叶子时如果存在奇连通块就加入新边,直到不存在奇连通块。由于在加边的过程中新加入的边的存在时间被确定,所以在线段树上更新即可。

时间复杂度:\(O(m\log n\log m)\)

Code

#include <bits/stdc++.h>// #define int int64_tconst int kMaxN = 1e5 + 5, kMaxM = 3e5 + 5;int n, m, p, cnt_odd;
int ans[kMaxM];
std::tuple<int, int, int, int> ed[kMaxM];
std::vector<std::pair<int, int>> vec[kMaxM * 4];struct DSU {int fa[kMaxN], sz[kMaxN], rnk[kMaxN];std::vector<std::tuple<int, int, int>> vec;void init() {for (int i = 1; i <= n; ++i)fa[i] = i, sz[i] = 1, rnk[i] = 0;cnt_odd = n;}void back(int t) {for (; vec.size() > t; vec.pop_back()) {auto [fx, fy, det] = vec.back();cnt_odd -= (sz[fy] & 1);fa[fx] = fx, rnk[fy] -= det, sz[fy] -= sz[fx];cnt_odd += (sz[fx] & 1) + (sz[fy] & 1);}}int find(int x) { return x == fa[x] ? x : find(fa[x]); }void unionn(int x, int y) {int fx = find(x), fy = find(y);if (fx == fy) return;if (rnk[fx] > rnk[fy]) std::swap(fx, fy);int det = (rnk[fx] == rnk[fy]);cnt_odd -= (sz[fx] & 1) + (sz[fy] & 1);fa[fx] = fy, rnk[fy] += det, sz[fy] += sz[fx];vec.emplace_back(fx, fy, det);cnt_odd += (sz[fy] & 1);}
} dsu;void update(int x, int l, int r, int ql, int qr, std::pair<int, int> ed) {if (l > qr || r < ql) return;else if (l >= ql && r <= qr) return void(vec[x].emplace_back(ed));int mid = (l + r) >> 1;update(x << 1, l, mid, ql, qr, ed), update(x << 1 | 1, mid + 1, r, ql, qr, ed);
}void solve(int x, int l, int r) {int t = dsu.vec.size();for (auto [u, v] : vec[x]) dsu.unionn(u, v);if (l == r) {for (; p < m && cnt_odd;) {++p;auto [w, u, v, id] = ed[p];if (id <= l) {dsu.unionn(u, v);update(1, 1, m, id, l - 1, {u, v});}}if (!cnt_odd) ans[l] = std::get<0>(ed[p]);else ans[l] = -1;} else {int mid = (l + r) >> 1;solve(x << 1 | 1, mid + 1, r);solve(x << 1, l, mid);}dsu.back(t);
}void dickdreamer() {std::cin >> n >> m;for (int i = 1; i <= m; ++i) {int u, v, w;std::cin >> u >> v >> w;ed[i] = {w, u, v, i};}std::sort(ed + 1, ed + 1 + m);dsu.init();solve(1, 1, m);for (int i = 1; i <= m; ++i) std::cout << ans[i] << '\n';
}int32_t main() {
#ifdef ORZXKRfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifstd::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T = 1;// std::cin >> T;while (T--) dickdreamer();// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/835384.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猿人学web端爬虫攻防大赛赛题第20题——2022新春快乐

题目网址:https://match.yuanrenxue.cn/match/20 解题步骤解题之前需要先了解wasm是什么:https://docs.pingcode.com/ask/294587.html看数据包。sign是一串加密的字符串,t一看就是时间戳。全局搜索api/match/20,只有一处。打断点,触发。看下sign的生成逻辑。 "sign&q…

[Tricks-00004]CF1954F(自己胡的 trick,被 Burnside 完爆)

介绍下自己的离奇思路: 先读清楚题意!要求是旋转等价,即两个以 \(c\) 个 \(1\) 开头,总 \(1\) 个数不超过 \(k+c\) 的字符串算一种。 那怎么刻画"只算一种"这个条件呢?一个想法可以是,对每个字符串赋一个权值,一种字符串的权值即旋转出来的每个合法的,把它们…

工控机维修数据恢复

工控机是一种加固的增强型个人计算机,由于经常在环境比较恶劣的情况下运行,对数据的安全性要求也更高。 一、数据丢失的原因 用户误操作:如错误删除文件、不小心切断电源等,这些操作可能导致数据丢失或损坏。 入侵与感染:恶意程序可能破坏硬盘数据,甚至具有格式硬盘的功能…

RAG 系统高效检索提升秘籍:如何精准选择 BGE 智源、GTE 阿里与 Jina 等的嵌入与精排模型的完美搭配

RAG 系统高效检索提升秘籍:如何精准选择 BGE 智源、GTE 阿里与 Jina 等的嵌入与精排模型的完美搭配RAG 系统高效检索提升秘籍:如何精准选择 BGE 智源、GTE 阿里与 Jina 等的嵌入与精排模型的完美搭配 Text Embedding 榜单:MTEB、C-MTEB 《MTEB: Massive Text Embedding Benc…

Golang的GMP调度模型与源码解析

0、引言 我们知道,这当代操作系统中,多线程和多进程模型被广泛的使用以提高系统的并发效率。随着互联网不断的发展,面对如今的高并发场景,为每个任务都创建一个线程是不现实的,使用线程则需要系统不断的在用户态和内核态之间不断的切换,引起不必要的损耗,于是引入了协程…

有限状态机(FSM)的使用

有限状态机的使用 有限状态机在游戏制作中十分常见,它既可以作为玩家角色的控制框架,纯代码控制动画的播放,免去动画间的“连连看”;也可以制作简单的AI,甚至还可以搭配其它AI决策方式做出更复杂易用的AI控制……本文仅是个人对有限状态机的理解,与大家一同交流有限状态机…

【学习篇】patran设置阻尼

在数学和力学甚至机械专业中,质量-弹簧-阻尼系统是基础、经典的模型。其数学模型表示为: $$ m\ddot{x} +c\dot{x} +kx = 0 \qquad(1) $$ 有限元模型比较简单,就是两个质量点+弹簧假设上述式子的初值为 $$ \begin{cases} u(0)=0.2 \ \dot{u}(0)=0 \end{cases} $$ 各项系数为变…

mysql 查询每个订单总价和购买商品的总类数

数据表 CREATE TABLE goods ( order_id INT NOT NULL, goods_id INT NOT NULL, price DECIMAL(10, 2) NOT NULL ); 插入数据 INSERT INTO goods (order_id, goods_id, price) VALUES (1, 1, 3.5), (1, 2, 4.0), (2, 4, 6.0); 数据查询 SELECT order_id, SUM(price) AS total_pr…

【视频讲解】Python深度神经网络DNNs-K-Means(K-均值)聚类方法在MNIST等数据可视化对比分析

全文链接:https://tecdat.cn/?p=38289 原文出处:拓端数据部落公众号 分析师:Cucu Sun 近年来,由于诸如自动编码器等深度神经网络(DNN)的高表示能力,深度聚类方法发展迅速。其核心思想是表示学习和聚类可以相互促进:好的表示会带来好的聚类效果,而好的聚类为表示学习提…

时间

JDK7 时间 全世界的时间, 有一个统一的计算标准. 格林尼治时间/格林威治时间 (Greenwich Mean Time) 简称 GMT. 计算核心: 地球自转一天是 24 小时, 太阳直射时为正午 12 点. 后来发现计算误差较大, 现在格林威治时间已经不再作为标准时间来使用了. 到了 2012 年 1 月, 取消了用…

贴代码框架PasteForm特性介绍之markdown和richtext

简介 PasteForm是贴代码推出的 “新一代CRUD” ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代码生成器,你可以快速的为自己的项目构建后台管理端!目前管理端只有Html+js版本的,后续将支持小程序,Vue等 案例源码 案例源…