ABC392题解

A

算法标签: 模拟

在这里插入图片描述

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int w[3];for (int i = 0; i < 3; ++i) cin >> w[i];sort(w, w + 3);if (w[0] * w[1] == w[2]) cout << "Yes" << "\n";else cout << "No";return 0;
}

B

算法标签: 哈希表

在这里插入图片描述

#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_set>
#include <vector>using namespace std;const int N = 1010;int range, n, w[N];int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);unordered_set<int> s;cin >> range >> n;for (int i = 0; i < n; ++i) {int val;cin >> val;s.insert(val);}vector<int> res;for (int i = 1; i <= range; ++i) {if (!s.count(i)) res.push_back(i);}cout << res.size() << "\n";for (int val : res) cout << val << " ";cout << "\n";return 0;
}

C

算法标签: 模拟

在这里插入图片描述

#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_set>
#include <vector>using namespace std;const int N = 3e5 + 10;int n;
int p[N], q[N];
int pos[N];int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n;for (int i = 1; i <= n; ++i) cin >> p[i];for (int i = 1; i <= n; ++i) {cin >> q[i];pos[q[i]] = i;}for (int i = 1; i <= n; ++i) {int per = pos[i];int see = p[per];cout << q[see] << " ";}cout << "\n";return 0;
}

D

算法标签: 桶计数, 模拟

在这里插入图片描述

*精度不够的错误案例

而且没说两个骰子只有一个点数相等, 下面做法有遗漏情况

#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_set>
#include <vector>using namespace std;const int N = 110, M = 1e5 + 10;
const double EPS = 1e-20;int n;
int cnt[N];
// 记录每个骰子 每个数字出现的概率
double w[N][M];int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n;for (int i = 1; i <= n; ++i) {cin >> cnt[i];for (int j = 1; j <= cnt[i]; ++j) {int val;cin >> val;w[i][val] += 1.0 / cnt[i];}}// 枚举点数double res = 0;for (int i = 1; i < M; ++i) {vector<double> nums;for (int j = 1; j <= n; ++j) {if (w[j][i] > EPS) nums.push_back(w[j][i]);}sort(nums.begin(), nums.end(), greater<double>());if (nums.size() < 2) continue;double tmp = nums[0] * nums[1];res = max(res, tmp);}printf("%lf\n", res);return 0;
}

正确解法

#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_set>
#include <vector>using namespace std;typedef long double LD;
const int N = 110, M = 1e5 + 10;
const double EPS = 1e-20;int n;
int cnt[N];
int w[N][M];int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n;for (int i = 1; i <= n; ++i) {cin >> cnt[i];for (int j = 1; j <= cnt[i]; ++j) {int val;cin >> val;w[i][val]++;}}LD res = 0;for (int i = 1; i < n; ++i) {for (int j = i + 1; j <= n; ++j) {LD curr = 0;for (int k = 1; k < M; ++k) {curr +=( (LD) w[i][k] / cnt[i]) * ((LD) w[j][k] / cnt[j]);}res = max(res, curr);}}printf("%.15Lf\n", res);return 0;
}

E

算法标签: D S U DSU DSU, 并查集

在这里插入图片描述

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>using namespace std;typedef pair<int, int> PII;
const int N = 2e5 + 10, M = 4e5 + 10;int n, m;
int p[N];
int vers[M];
bool vis[M];int find(int u) {if (p[u] != u) p[u] = find(p[u]);return p[u];
}int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> m;for (int i = 1; i <= n; ++i) p[i] = i;for (int i = 1; i <= m; ++i) {int u, v;cin >> u >> v;int fa1 = find(u);int fa2 = find(v);if (fa1 != fa2) p[fa2] = fa1;else {vis[i] = true;vers[i] = u;}}int res = 0;for (int i = 1; i <= n; ++i) {if (p[i] == i) res++;}cout << res - 1 << "\n";int k = 1;for (int i = 1; i <= n; ++i) {if (!vis[i]) continue;while (k <= n && find(k) == find(vers[i])) k++;if (k > n) break;int fa1 = find(k);int fa2 = find(vers[i]);p[fa1] = fa2;cout << i << " " << vers[i] << " " << k << "\n";}return 0;
}

F

算法标签: 树状数组, F e n w i c k − T r e e Fenwick-Tree FenwickTree, B S T BST BST

在这里插入图片描述

思路

如果正着做, 插入不好操作, 平衡树操作, 如果倒着做, 插入第 n n n个数, 所在位置 p n − 1 p_{n - 1} pn1, 初始化树状数组每个位置 1 1 1, 如果这个位置被占用将其改为 0 0 0, 寻找从左往右的第 p n − 1 p_{n - 1} pn1个空格, 也就是找 p n − 1 p_{n - 1} pn1就是找前缀和等于 p n − 1 p_{n - 1} pn1的位置, 时间复杂度 O ( n log ⁡ 2 n ) O(n\log ^ 2n) O(nlog2n)

树状数组写法

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 5e5 + 10;int n, w[N];
int tr[N], res[N];int lowbit(int val) {return val & -val;
}void add(int u, int val) {for (int i = u; i <= n; i += lowbit(i)) tr[i] += val;
}int query(int u) {int res = 0;for (int i = u; i; i -= lowbit(i)) res += tr[i];return res;
}int find(int val) {int l = 1, r = n;while (l < r) {int mid = l + r >> 1;if (query(mid) >= val) r = mid;else l = mid + 1;}return l;
}int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n;for (int i = 1; i <= n; ++i) cin >> w[i];for (int i = 1; i <= n; ++i) add(i, 1);for (int i = n; i >= 1; --i) {int pos = find(w[i]);res[pos] = i;add(pos, -1);}for (int i = 1; i <= n; ++i) cout << res[i] << " ";cout << "\n";return 0;
}

线段树写法

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 5e5 + 10;int n, w[N];
struct Node {int l, r;int sum;
} tr[N << 2];
int res[N];void push_up(int u) {tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}void build(int u, int l, int r) {if (l == r) {tr[u] = {l, r, 1};return;}tr[u] = {l, r};int mid = l + r >> 1;build(u << 1, l, mid);build(u << 1 | 1, mid + 1, r);push_up(u);
}void update(int u, int pos, int val) {if (tr[u].l == tr[u].r) {tr[u].sum += val;return;}int mid = tr[u].l + tr[u].r >> 1;if (pos <= mid) update(u << 1, pos, val);if (pos > mid) update(u << 1 | 1, pos, val);push_up(u);
}// 查询和为val的起始位置
int query(int u, int k) {if (tr[u].l == tr[u].r) return tr[u].l;if (tr[u << 1].sum < k) return query(u << 1 | 1, k - tr[u << 1].sum);else return query(u << 1, k);
}int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n;for (int i = 1; i <= n; ++i) cin >> w[i];build(1, 1, n);for (int i = n; i >= 1; --i) {// 找到第w[i]个未被赋值的位置int pos = query(1, w[i]);res[pos] = i;update(1, pos, -1);}for (int i = 1; i <= n; ++i) cout << res[i] << " ";cout << "\n";return 0;
}

G

算法标签: F F T FFT FFT, N T T NTT NTT, 卷积

在这里插入图片描述

思路

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

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

相关文章

Quartus + VScode 实现模块化流水灯

文章目录 一、通过VScode编写Verilog代码二、模块化编程三、代码示例 一、通过VScode编写Verilog代码 1、下载Vscode 2、下载相关插件 搜索Verilog就会弹出有如图所示的插件&#xff0c;下载并安装 3、创建Quartus项目 4、创建完成后点击Tools&#xff0c;选择Options 然后在…

简单讲一下控制系统所用的PID公式

2025年3月23日电子电工实验室讲课大纲 哈喽&#xff0c;小伙伴们大家好&#xff0c;今天我们来讲一下PID&#xff01;首先我们的针对的场景是什么——循迹小车&#xff01; 就是我们刚入手STM32时&#xff0c;我们可能会制作一个循迹小车。我们想让那个小车走直线&#xff0c;但…

直观理解ECC椭圆曲线加密算法

数学还是挺有逻辑的&#xff0c;给出计算的操作步骤 就能得出想要结果 背景&#xff1a; ● ECC 是一种极其巧妙的 非对称加密算法 , 其完美利用了 椭圆曲线几何累加 不可逆的性质 ● 拥有 密钥体积小&#xff0c;计算速度快的优势&#xff0c;被广泛用于各种区块链&#xff0c…

深度解析 Android Matrix 变换(二):组合变换 pre、post

前言 在上一篇文章中&#xff0c;我们讲解了 Canvas 中单个变换的原理和效果&#xff0c;即缩放、旋转和平移。但是单个旋转仅仅是基础&#xff0c;Canvas 变换最重要的是能够随意组合各种变换以实现想要的效果。在这种情况下&#xff0c;就需要了解如何组合变换&#xff0c;以…

c++之迭代器

一.迭代器的基本概念 1.什么是迭代器 迭代器是一种对象&#xff0c;它提供了一种访问容器中各个元素的方法&#xff0c;同时隐藏了容器内部的实现细节。简单来说&#xff0c;迭代器就像是一个指针&#xff0c;它可以指向容器中的某个元素&#xff0c;并且能够通过一些操作&am…

在 .NET 9.0 Web API 中实现 Scalar 接口文档及JWT集成

示例代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90408075 介绍 随着 .NET 9 的发布&#xff0c;微软宣布他们将不再为任何 .NET API 项目提供默认的 Swagger gen UI。以前&#xff0c;当我们创建 .NET API 项目时&#xff0c;微软会自动添加 Swagger…

【操作系统笔记】操作系统的功能

上节课,我们学习了《什么是操作系统》。接下来,我们来看看操作系统有哪些功能? 这里讲的内容有两部分,一个是操作系统的目标,另外一个就是操作系统的功能。这两个细节可能会在考试的时候考到,但是最近好些年很少考到了。为了理解,我们还是一起来看一下。 操作系统的目标…

C/C++蓝桥杯算法真题打卡(Day7)

一、P8723 [蓝桥杯 2020 省 AB3] 乘法表 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> // 包含标准库中的所有头文件&#xff0c;通常用于竞赛编程中简化代码 using namespace std; // 使用标准命名空间&#xff0c;避免每次调用标准库函数时都要加std:: ty…

数据结构5(初):排序

目录 1、排序的概念以及常见的排序算法 1.1、排序的概念 1.2、常见的排序算法 2、常见排序算法的实现 2.1、插入排序 2.1.1、直接插入排序 2.1.2、希尔排序 2.2、选择排序 2.2.1、直接选择排序 2.2.2、堆排序 2.3、交换排序 2.3.1、冒泡排序 2.3.2、快速排序 2.3.…

VS2022中通过VCPKG安装的ceres之后调试ceres的例程设置

1.采用C20. vcpkg中设置: 2.增加预处理宏: GLOG_USE_GLOG_EXPORT 3.屏蔽sdl错误 在 项目-属性-C/C -命令行中添加 /sdl /w34996 #include "ceres/ceres.h" //#include <iostream> //#include<glog/logging.h>using ceres::AutoDiffCostFunction; usi…

Pydantic字段级校验:解锁@validator的12种应用

title: Pydantic字段级校验:解锁@validator的12种应用 date: 2025/3/23 updated: 2025/3/23 author: cmdragon excerpt: Pydantic校验系统支持通过pre验证器实现原始数据预处理,在类型转换前完成字符清洗等操作。格式验证涵盖正则表达式匹配与枚举值约束,确保护照编号等字…

函数递归和迭代

1.什么是递归&#xff1f; 在C语言中递归就是自己调用自己。 看一下简单函数的递归&#xff1a; 上面的代码实现演示一下函数的递归&#xff0c;最终是会陷入死循环的&#xff0c;栈溢出 。 1.1递归的思想&#xff1a; 把一个大型的问题一步一步的转换成一个个小的子问题来解…

发票查验/发票验真如何用Java实现接口调用

一、什么是发票查验&#xff1f;发票验真接口&#xff1f; 输入发票基本信息发票代码、发票号码、开票日期、校验码后6位、不含税金额、含税金额&#xff0c;核验发票真伪。 该接口也适用于机动车、二手车销售发票、航空运输电子客票、铁路电子客票等。 二、如何用Java实现接口…

AM32-MultiRotor-ESC项目固件编译和烧录方法介绍

AM32-MultiRotor-ESC项目固件编译和烧录方法介绍 &#x1f4cd;AM32-MultiRotor-ESC项目地址:https://github.com/AlkaMotors/AM32-MultiRotor-ESC-firmware&#x1f388;Updater with V8 Bootloader&#xff1a; https://github.com/AlkaMotors/F051_Bootloader_Updater&#…

HarmonyOS:@AnimatableExtend 装饰器自学指南

在最近的项目开发中&#xff0c;我遇到了需要实现复杂动画效果的需求。在探索解决方案的过程中&#xff0c;我发现了 AnimatableExtend 装饰器&#xff0c;它为实现动画效果提供了一种非常灵活且强大的方式。然而&#xff0c;在学习这个装饰器的过程中&#xff0c;我发现相关的…

Windows server 2022域控制服务器的配置

Windows server 2022介绍 一、核心特性与改进 安全核心服务器&#xff08;Secured-Core Server&#xff09; 硬件级安全&#xff1a;支持基于硬件的安全功能&#xff08;如TPM 2.0、Secure Boot、基于虚拟化的安全防护VBS&#xff09;&#xff0c;防止固件攻击。受信任的启动链…

C++语法之模板函数和模板类

模板函数是什么&#xff1f;就是不指定类型的函数&#xff0c;不指定类型如何写代码?所以得用到模板&#xff0c;可以先用模板代替&#xff0c;就好像方程式&#xff0c;先用x,y代替一样。 它的写法是这样&#xff0c;定义函数时&#xff0c;开头加一句:(其中的T就相当于x,y之…

时序分析笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、周期约束 二、建立时间和保持时间 三、时序路径 四、时序模型 前言 约束文件笔记&#xff0c;傅里叶的猫的视频。 一、周期约束 时序约束就是告诉软件输…

六十天前端强化训练之第二十八天之Composition 函数完全指南

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、核心概念解析 1.1 什么是 Composition 函数 1.2 为什么需要封装 1.3 设计原则 二、实战案例&#xff1a;鼠标跟踪器 2.1 未封装版本 2.2 封装后的 Composition 函数…

MySQL 锁机制详解

MySQL 锁机制详解 5.1 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、 RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有 效性是所有数…