2021 CCF CSP-S2.廊桥分配

题目

4090. 廊桥分配
在这里插入图片描述

算法标签: 模拟, 贪心, 堆

思路

可以将每个飞机的起始时间和离开时间看作一个线段, 每个廊桥在同一时间只能服务一架飞机, 因为先到先得因此是按照起始时间进行排序

每个廊桥只关心最后一架飞机离开的时刻, 对于每个飞机有开始时间和离开时间, 对于每个空闲的廊桥来说, 安排到任意一个廊桥都是一样的, 朴素的做法是枚举国内分配廊桥的数量, 再枚举飞机, 但是时间复杂来到了 1 0 5 × 1 0 5 10 ^ 5 \times 10 ^ 5 105×105, 需要进行优化

因为放置到每个空闲廊桥是一样的, 因此可以按照廊桥编号从小到大放置飞机, 然后枚举分配给国内航班的廊桥数量, 维护两个小根堆分别代表使用的廊桥和空闲的廊桥, 时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>using namespace std;const int N = 10010, M = 50010, K = 19, INF = 0x3f3f3f3f;int n, m, q;
int head[N], ed[N << 1], ne[N << 1], w[N << 1], idx;
// 求路径上信息使用倍增优化
int fa[N][K], f[N][K], depth[N];
int p[N];
struct Edge {int u, v, w;bool operator< (const Edge &e) const {return w > e.w;}
} edges[M];void add(int u, int v, int val) {ed[idx] = v, ne[idx] = head[u], w[idx] = val, head[u] = idx++;
}int find(int u) {if (p[u] != u) p[u] = find(p[u]);return p[u];
}void kruskal() {sort(edges, edges + m);for (int i = 0; i < m; ++i) {auto [u, v, w] = edges[i];int fa1 = find(u);int fa2 = find(v);if (fa1 == fa2) continue;p[fa2] = fa1;add(u, v, w), add(v, u, w);}
}void dfs(int u, int pre, int dep) {depth[u] = dep;for (int i = head[u]; ~i; i = ne[i]) {int v = ed[i];if (v == pre) continue;fa[v][0] = u;f[v][0] = w[i];for (int k = 1; k < K; ++k) {int mid = fa[v][k - 1];fa[v][k] = fa[mid][k - 1];f[v][k] = min(f[v][k - 1], f[mid][k - 1]);}dfs(v, u, dep + 1);}
}int calc(int u, int v) {if (find(u) != find(v)) return -1;int ans = INF;if (depth[u] < depth[v]) swap(u, v);for (int k = K - 1; k >= 0; --k) {if (depth[fa[u][k]] >= depth[v]) {ans = min(ans, f[u][k]);u = fa[u][k];}}if (u == v) return ans;for (int k = K - 1; k >= 0; --k) {if (fa[u][k] != fa[v][k]) {ans = min({ans, f[u][k], f[v][k]});u = fa[u][k];v = fa[v][k];}}ans = min({ans, f[u][0], f[v][0]});return ans;
}int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);memset(head, -1, sizeof head);memset(f, 0x3f, sizeof f);cin >> n >> m;for (int i = 1; i <= n; ++i) p[i] = i;for (int i = 0; i < m; ++i) {int u, v, w;cin >> u >> v >> w;edges[i] = {u, v, w};}kruskal();for (int i = 1; i <= n; ++i) {if (depth[i] == 0) dfs(i, -1, 1);}cin >> q;while (q--) {int u, v;cin >> u >> v;int ans = calc(u, v);if (ans == INF) ans = -1;cout << ans << "\n";}return 0;
}

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

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

相关文章

MCP系列之实践篇:搭建你的第一个MCP应用

前言 在前两篇文章中&#xff0c;我们已经介绍了MCP&#xff08;模型上下文协议&#xff09;的基本概念和技术架构。本篇文章将从理论走向实践&#xff0c;通过一个简单但完整的案例&#xff0c;手把手教你如何搭建和调试一个基于MCP的应用。我们将一起构建一个天气查询和活动…

《软件设计师》复习笔记(4.2)——关系代数、函数依赖、范式

目录 一、关系代数 基本运算 笛卡尔积&#xff08;&#xff09; 投影&#xff08;π&#xff09; 选择&#xff08;σ&#xff09; 自然连接&#xff08;⋈&#xff09; 真题示例&#xff1a; 二、函数依赖 基本概念 Armstrong公理系统 键与约束 三、范式&#xff…

【TeamFlow】 1 TeamFlow 去中心化生产协同系统架构

总体架构设计 采用四层混合架构&#xff0c;结合分层设计与去中心化网络&#xff1a; #mermaid-svg-qBgw9wMd8Gi0gOci {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qBgw9wMd8Gi0gOci .error-icon{fill:#552222;}…

宜搭与金蝶互通——连接器建立

一、 进入连接器工厂 图1 连接器入口 二、 新建连接器 图2 新建连接器第一步 1、 连接器显示名,如图2中①所示; 2、 图2中②域名,是金蝶系统API接口里面的“完整服务地址”com之前的信息,不含“https”,如图3中①所示; 3、 Base Url通常为“/”,如图2…

【Linux系统篇】:System V IPC核心技术解析---从共享内存到消息队列与信号量

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 一.System V共享内存&#xff08;重点&#xff09;1.基本概念和原理…

C++ 20 信号量详解

C 20 信号量详解 一、信号量类型 C20 标准中定义了两种信号量&#xff1a; std::counting_semaphore<Max>&#xff1a;计数信号量&#xff08;允许资源池最多有 Max 个资源&#xff09;std::binary_semaphore&#xff1a;二进制信号量&#xff08;等价于 std::countin…

Vue3中provide和inject的用法示例

在 Vue3 中&#xff0c;provide 和 inject 用于实现跨层级组件通信。以下是一个简单的示例&#xff1a; 1. 父组件 (祖先组件) - 提供数据 javascript 复制 // ParentComponent.vue import { provide, ref, reactive } from vue;export default {setup() {// 提供静态数据p…

Spring数据访问全解析:ORM整合与JDBC高效实践

目录 一、Spring ORM集成深度剖析 &#x1f31f; ORM模块架构设计 核心集成特性&#xff1a; 整合MyBatis示例配置&#xff1a; 二、Spring JDBC高效实践指南 &#x1f31f; 传统JDBC vs Spring JDBC对比 &#x1f31f; JdbcTemplate核心操作示例 批量操作优化&#xf…

UE快速预览材质节点快捷键

开始预览节点 添加快捷键 然后按R就能快速预览 不用再右键了 非常方便

Java漏洞原理与实战

一、基本概念 1、序列化与反序列化 (1)序列化:将对象写入IO流中&#xff0c;ObjectOutputStream类的writeobject()方法可以实现序列化 (2)反序列化:从IO流中恢复对象&#xff0c;ObjectinputStream类的readObject()方法用于反序列化 (3)意义:序列化机制允许将实现序列化的J…

每日算法【双指针算法】(Day 1-移动零)

双指针算法 1.算法题目&#xff08;移动零&#xff09;2.讲解算法原理3.编写代码 1.算法题目&#xff08;移动零&#xff09; 2.讲解算法原理 数组划分&#xff0c;数组分块&#xff08;快排里面最核心的一步&#xff09;只需把0改为tmp 双指针算法&#xff1a;利用数组下标来…

SQL Server 的鎖機制

SQL Server 的鎖機制是為了確保數據的一致性和事務的隔離性而設計的。以下是針對讀寫操作的鎖定行為的詳細說明&#xff1a; 1. 鎖的基本類型 SQL Server 的鎖主要分為以下幾類&#xff1a; 共享鎖&#xff08;Shared Lock, S Lock&#xff09; 用於讀操作&#xff08;如 S…

AIP目录

专注于开发灵活API的设计文档。 AIP是总结了谷歌API设计决策的设计文档&#xff0c;它也为其他人提供了用文档记录API设计规则和实践的框架和系统。 基础1AIP目的和指南2AIP编号规则3AIP版本管理200先例8AIP风格与指导9术语表流程100API设计评审常见问题205Beta版本发布前置条…

CSS进度条带斑马纹动画(有效果图)

效果图 .wxml <view class"tb"><view class"tb-line" style"transform:translateX({{w%}})" /> </view> <button bind:tap"updateLine">增加进度</button>.js Page({data: {w:0,},updateLine(){this.…

【工具-Krillin AI】视频翻译、配音、语音克隆于一体的一站式视频多语言转换工具~

Krillin AI 是全能型音视频本地化与增强解决工具。这款简约而强大的工具&#xff0c;集音视频翻译、配音、语音克隆于一身&#xff0c;支持横竖屏格式输出&#xff0c;确保在所有主流平台&#xff08;哔哩哔哩&#xff0c;小红书&#xff0c;抖音&#xff0c;视频号&#xff0c…

zset.

zset 有序集合 zset 保留了 set 不能有重复元素的特点 zset 中的每个元素都有一个唯一的浮点类型的分数&#xff08;score&#xff09;与之关联&#xff0c;使得 zset 内部的元素是可以维护有序性的。但是这个有序不是用下标作为排序依据的&#xff0c;而是根据分数&#xf…

Spring 数据库编程

Spring JDBC 传统的JDBC在操作数据库时&#xff0c;需要先打开数据库连接&#xff0c;执行SQL语句&#xff0c;然后封装结果&#xff0c;最后关闭数据库连接等资源。频繁的数据库操作会产生大量的重复代码&#xff0c;造成代码冗余&#xff0c;Spring的JDBC模块负责数据库资源…

492Q 型气缸盖双端面铣削组合铣床总体设计

一、引言 492Q 型气缸盖是发动机的重要组成部分&#xff0c;其双端面的加工精度对发动机的性能和可靠性有着重要影响。设计一款适用于 492Q 型气缸盖双端面铣削的组合铣床&#xff0c;能够提高加工效率和质量&#xff0c;满足发动机生产的需求。 二、总体设计要求 加工精度&…

颚式破碎机的设计

一、引言 颚式破碎机作为矿山、建材等行业的重要破碎设备&#xff0c;其性能优劣直接影响物料破碎效率与质量。随着工业生产规模的扩大和对破碎效率要求的提高&#xff0c;设计一款高效、稳定、节能的颚式破碎机具有重要意义。 二、设计需求分析 处理能力&#xff1a;根据目…

第三阶段面试题

Nginx nginx常用模块以及其功能 proxy模块&#xff0c;进行代理功能 ssl模块&#xff0c;进行HTTPS协议的使用 gzip模块&#xff0c;进行传输数据的压缩 upstream模块&#xff0c;进行反向代理时使用 static模块&#xff0c;静态资源进行访问的模块 cache模块&#xff0…