Atcoder ABC 360 全题解

致歉

对不起,我不应该在全题解的编写上咕咕咕两个月,导致流量大量流失。

我知错了,下次还犯。

AB

C

考虑一个箱子里的所有球,我们需要把这些球放进互不相同的一些箱子里。然而我们可以留一个球在箱子里,显然留重量最大的最好,所以答案就是 $ \sum_{i=1}^{N} W_i $ 减去每个箱子里的最重的球的重量(没球的为 0)。

// Problem: C - Move It
// Contest: AtCoder - AtCoder Beginner Contest 360
// URL: https://atcoder.jp/contests/abc360/tasks/abc360_c
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;int a[100005], w[100005];
int sum[100005], mx[100005];int main() {int n;scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);a[i]--;}for (int i = 0; i < n; i++) {scanf("%d", &w[i]);sum[a[i]] += w[i];mx[a[i]] = max(mx[a[i]], w[i]);}int ans = 0;for (int i = 0; i < n; i++) {ans += sum[i] - mx[i];}printf("%d", ans);
}

D

显然只有相对的两只蚂蚁可能相遇,所以我们可以先记录向右的蚂蚁坐标,然后对向左的蚂蚁使用二分。

假如两只蚂蚁各走了 $ K $ 个单位的长度,我们可以相对运动(bushi,把一只蚂蚁固定住,这时候另一只蚂蚁为了追上摆烂的蚂蚁(),就会以两倍的速度怒气冲冲的赶过去()()()

所以对于一只位于 $ X $ 的,向左的蚂蚁,她(?)能遇到的向右的蚂蚁坐标就处在 $ X - 2T \sim X $ 中,然后就可以愉快的使用二分了。

// Problem: D - Ghost Ants
// Contest: AtCoder - AtCoder Beginner Contest 360
// URL: https://atcoder.jp/contests/abc360/tasks/abc360_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;#define ll long long
ll a[200005], b[200005];int main() {int n;ll t;cin >> n >> t;string s;cin >> s;int p = 0, q = 0;for (int i = 0; i < n; i++) {ll x;scanf("%lld", &x);if (s[i] == '1') {a[p++] = x;} else {b[q++] = x;}}sort(a, a + p);ll ans = 0;for (int i = 0; i < q; i++) {ans += upper_bound(a, a + p, b[i]) - lower_bound(a, a + p, b[i] - t - t);// upper_bound(a, a + p, b[i]) 查询第一个 > b[i] 的,即太右的蚂蚁// lower_bound(a, a + p, b[i] - t - t) 查询第一个 >= b[i] - 2t 的,即可以在 t 时间内遇到的蚂蚁}printf("%lld", ans);
}

E

神仙期望。

期望是这样的,出题人只需要写标程得到一个半 rng 不 rand 的东西就可以了,而我们写各种程序凑到 $ \frac{1}{998244353} $ 的概率可就难了。


首先 1 和其它位置肯定要分开考虑,毕竟要是运气那么不好,一直没有交换,那么黑球就一直留在 1 上了。

考虑(某种意义上的)DP,设 $ f $ 和 $ g $ 为黑球在 1 上的概率和黑球不在 1 上的概率。

转移的概率:

  • $ f \to g : \cfrac{2}{N} - \cfrac{2}{N^2} $

  • $ g \to f : \cfrac{2}{N^2} $

  • $ f \to f : 1 - \cfrac{2}{N} + \cfrac{2}{N^2} $

  • $ g \to g : 1 - \cfrac{2}{N^2} $

然后进行转移。

易证如果不是 1 那么概率均等,所以最后的答案就是 $ f + (\cfrac{N}{2} + 1)g $。

// Problem: E - Random Swaps of Balls
// Contest: AtCoder - AtCoder Beginner Contest 360
// URL: https://atcoder.jp/contests/abc360/tasks/abc360_e
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;#define ll long long
#define mod 998244353ll qpow(ll a, ll x, ll m) {ll ans = 1;while (x) {if (x & 1) {ans = ans * a % m;}x >>= 1;a = a * a % m;}return ans;
}int main() {ll n, m;scanf("%lld %lld", &n, &m);ll on1 = 1, other = 0;ll other_1 = 2 * qpow(n, 2 * mod - 4, mod) % mod; // f -> gll swapp = (2 * qpow(n, mod - 2, mod) % mod + 2 * (mod - qpow(n, 2 * mod - 4, mod)) % mod) % mod; // g -> f// 注 mod - x 在模 mod 意义下就相当于 -xfor (int i = 0; i < m; i++) {ll n1 = 0, no = 0;// other + (1 other / other 1)n1 += other * other_1 % mod;// 1 + no swapn1 += on1 * (mod + 1 - swapp) % mod;// other + (bushi 1no += other * (mod + 1 - other_1) % mod;// 1 + swapno += on1 * swapp % mod;on1 = n1 % mod;other = no % mod;}printf("%lld", (on1 + (n * 499122177 + 1) % mod * other % mod) % mod); // 499122177 * 2 = 998244354
}

F

扫描线。

考虑将 $ (l, r) $ 表示成一个点。

那么,跟 $ (l, r) $ 相交的区间就会是两个长方形:$ 0 \le x \le l - 1, l + 1 \le y \le f - 1 $ 和 $ l + 1 \le x \le r - 1, r + 1 \le y \le 1e9 $,而我们要做的就是找到被长方形覆盖次数最多的一个点。

这个问题可以用扫描线解决,但是这里的线段树就简单很多了:区间修改,区间查询最大值,以及最大值中最前面的下标。

注意需要特判一下答案为 $ (0, 1) $ 的情况。

// Problem: F - InterSections
// Contest: AtCoder - AtCoder Beginner Contest 360
// URL: https://atcoder.jp/contests/abc360/tasks/abc360_f
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;// bool _st;struct line { // 扫描“线”,使用一种差分int y, l, r, d;line(int _y = -1, int _l = -1, int _r = -1, int _d = 0) {y = _y, l = _l, r = _r, d = _d;}
} a[400005];bool cmp(line a, line b) {// 优先比坐标,同坐标先加后减(因为我的代码是这么写的)if (a.y != b.y) {return a.y < b.y;} else {return a.d > b.d;}
}namespace seg { // 线段树部分// 我选择动态开点int tot = 1, rt = 1;struct node {int idx, mx, l, r, tag;node() {idx = mx = l = r = tag = 0;}} tree[400005 << 5];void pushdown(int L, int R, int p) {int mid = (L + R) / 2;if (!tree[p].l) {tree[p].l = ++tot;tree[tree[p].l].idx = L;}tree[tree[p].l].mx += tree[p].tag;tree[tree[p].l].tag += tree[p].tag;if (!tree[p].r) {tree[p].r = ++tot;tree[tree[p].r].idx = mid + 1;}tree[tree[p].r].mx += tree[p].tag;tree[tree[p].r].tag += tree[p].tag;tree[p].tag = 0;}void update(int l, int r, int x, int L = 0, int R = 1e9, int &p = rt) {if (!p) {p = ++tot;tree[p].idx = L;}if (l <= L && R <= r) {tree[p].mx += x;tree[p].tag += x;return;}pushdown(L, R, p);int mid = (L + R) / 2;if (mid >= l) {update(l, r, x, L, mid, tree[p].l);}if (mid < r) {update(l, r, x, mid + 1, R, tree[p].r);}if (tree[tree[p].l].mx >= tree[tree[p].r].mx) {tree[p].idx = tree[tree[p].l].idx;} else {tree[p].idx = tree[tree[p].r].idx;}tree[p].mx = max(tree[tree[p].l].mx, tree[tree[p].r].mx);}
}// bool _ed;int main() {// cerr << (&_ed - &_st) / 1024.0 / 1024.0 << endl;int n;scanf("%d", &n);int cnt = 0;for (int i = 0; i < n; i++) {int l, r;scanf("%d %d", &l, &r);// 将四条线按照差分的方式(我写的左闭右闭所以更新先加后减)a[cnt++] = line(0, l + 1, r - 1, 1);a[cnt++] = line(l - 1, l + 1, r - 1, -1);a[cnt++] = line(l + 1, r + 1, 1e9, 1);a[cnt++] = line(r - 1, r + 1, 1e9, -1);}sort(a, a + cnt, cmp);int l = 0, r = 1, mx = 0;for (int i = 0; i < cnt; i++) {seg::update(a[i].l, a[i].r, a[i].d);if (a[i].y >= 0 && seg::tree[1].mx > mx) { // a[i].y >= 0 就是所谓的特判mx = seg::tree[1].mx;l = a[i].y, r = seg::tree[1].idx;}}printf("%d %d", l, r);
}

G

震惊!某博主竟然自己 hack 了自己的 AC 做法!这究竟是 Atcoder 的不重视,还是博主的自虐?()()()()()()


先讲一下被我 hack 的做法。

(此处省略 ? 字)

那么正解是什么呢,其实正解是一个类 LIS 的 DP:

设 $ f_{i, j, 0/1} $ 为前 $ i $ 个,当前 LIS 的最后一个为 $ j $,现在用过/没用过超能力()能得到的最大 LIS 是多长。

有两种转移方式:

  • $ 0 \to 0 $ ,$ 1 \to 1 $,正常转移即可。

  • $ 0 \to 1 $。

在 $ 0 \to 1 $ 的时候,必然是设成当前最大的 + 1 最好,不好也有个地方好()

注:这题在离散化(我的做法)时有个小坑,由于这里 LIS 是要严格递增的,所以要把每个数和这个数 +1 都放进去再离散化。

// Problem: G - Suitable Edit for LIS
// Contest: AtCoder - AtCoder Beginner Contest 360
// URL: https://atcoder.jp/contests/abc360/tasks/abc360_g
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;int a[200005], b[400005];
int c0[400005], c1[400005];// c0 是 f[][][0] 的树状数组,c1 是 f[][][1] 的void update(int *c, int u, int x) {while (u < 400003) {c[u] = max(c[u], x);u += (u & -u);}
}int query(int *c, int u) {int ans = 0;while (u) {ans = max(ans, c[u]);u -= (u & -u);}return ans;
}int main() {int n;scanf("%d", &n);int cnt = 0;for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);b[++cnt] = a[i];b[++cnt] = a[i] + 1;}sort(b + 1, b + 1 + cnt);cnt = unique(b + 1, b + 1 + cnt) - b;for (int i = 1; i <= n; i++) { // 离散化a[i] = lower_bound(b + 1, b + 1 + cnt, a[i]) - b + 1;}int mx0 = 0;for (int i = 1; i <= n; i++) {update(c0, a[i], query(c0, a[i] - 1) + 1);update(c1, a[i], query(c1, a[i] - 1) + 1);update(c1, mx0 + 1, query(c0, mx0) + 1);// 第三句务必写在最后!(不然会出现一个阶段多次转移)mx0 = max(mx0, a[i]);}printf("%d", max(query(c0, 400003), query(c1, 400003)));
}

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

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

相关文章

《与光重聚》 —— 属于他的夏日花火

题目是歌曲名称,from 《夏日花火》 (国产galgame ; 视觉小说「夏日花火」原声音乐集 - dizzylab PV视频 因为被平衡树制裁了,所以心血来潮写这篇文章,姑且算是练笔吧(毕竟好久不写鲜花了; 游戏本体发行时间:2022年10月28日,目前无DLC(永远的遗憾; 游戏背景设计是D…

玄机-第一章 应急响应-Linux日志分析

玄机-第一章 应急响应-Linux日志分析 账号root密码linuxrz ssh root@IP 1.有多少IP在爆破主机ssh的root帐号,如果有多个使用","分割 2.ssh爆破成功登陆的IP是多少,如果有多个使用","分割 3.爆破用户名字典是什么?如果有多个使用","分割 4.登陆…

使用 .NET 构建 UI 界面的各种方式

微软搞出了很多构建 UI 程序的框架,如 WinForms WPF WinUI MAUI,他们之间的简单对比可以看如下这篇官方文档 Overview of framework options - Windows apps | Microsoft Learn 本文主要是记录一下在搜索相关问题时,了解到的内容,不一定准确,如果发现错误,请留言补充。 1…

Docker详细安装教程

安装Docker: # 1,, 卸载旧的版本# 2,需要的安装 yum install -y yum-utils# 3, 设置镜像的仓库 https://blog.csdn.net/qq_43168442/article/details/116770163 (访问这个博客网站进行配置)# 更新yum软件包索引 yum makecache fast# 4,安装docker docker-ce 社区 ee企业…

详细讲解 Keil Pack Installer,以及通过 Keil 官网获取 Pack

前言 大家好,我是梁国庆。 收到粉丝留言,说 Keil 安装 Pack 不太明白,可不可以详细演示一下?当然可以有,直接视频+文章全部安排,我就是宠粉。 PS:第一次录视频有些紧张,见谅哈。微信视频号:https://weixin.qq.com/sph/AXbpYwEaw b站:https://www.bilibili.com/video…

webdav协议及我的笔记方案(私有部署)

背景 用markdown用于文章写作,有几年时间了,不是很喜欢折腾,主要就是在电脑上写,用的笔记软件就是typora。由于里面有很多工作相关的,以及个人资料相关的(包含了各种账号、密码啥的),所以不敢往各种云服务上放,还是想着数据由自己来管着。 自己管数据的话,就是数据存…

模拟集成电路设计系列博客——8.3.2 PLL中的抖动与相位噪声

8.3.2 PLL中的抖动与相位噪声 在PLL中有若干种抖动源,具体来说包括:输入参考的抖动\(\phi_{in}\) VCO中的抖动 环路滤波器产生的噪声 分频器产生的噪声由于任何实际PLL中的抖动都相对较小,因此分析其在环路中和环路内的传播可以使用线性小信号模型。上面列出的噪声源出现在环…

【git】github如何上传超过100MB大小的单个文件

在使用 GitHub 进行版本控制时,默认情况下,单个文件的大小限制为 100MB。 如果你需要上传超过这个大小的文件,可以使用 Git LFS(Large File Storage)。 Git LFS 是一种 Git 扩展,专门用于处理大文件,它将大文件替换为轻量级的指针,并将实际的文件内容存储在远程服务器上…

ros2 - microros - 雷达 -可视化点云

上一节完成了指定角度距离的测量这一节我们将其合成ROS的laserscan消息,并将其通过microros发布到上位机,最终实现rviz2的可视化。 一、雷达消息介绍使用指令ros2 interface show sensor_msgs/msg/LaserScan,可以看到ROS2对雷达数据接口的定义。# Single scan from a planar…

玄机流量特征分析-蚁剑流量分析

玄机流量特征分析-蚁剑流量分析 1.木马的连接密码是多少 2.黑客执行的第一个命令是什么 3.黑客读取了哪个文件的内容,提交文件绝对路径 4.黑客上传了什么文件到服务器,提交文件名 5.黑客上传的文件内容是什么 6.黑客下载了哪个文件,提交文件绝对路径1.过滤http,发现连接密码…

F407在RAM中调试

在RAM中调试代码 一.软硬件操作 硬件方面需要先修改BOOT0和BOOT1的引脚的高低电平。SRAM运行模式BOOT0和BOOT1都是高电平。软件方面: 1.需要先取消勾选Use Memory Layout from Target Dialog,点击下方的Edit编辑.sct2.修改.sct分散加载文件 原始文件 LR_IROM1 0x08000000 0x0…

制作badusb上线CS

‍ 前言在2014年美国黑帽大会上,安全研究人员JakobLell和独立安全研究人员Karsten Nohl展示了他们称为“BadUSB”的攻击方法,这种攻击方法让USB安全和几乎所有和USB相关的设备(包括具有USB端口的电脑)都陷入相当危险的状态现在的USB设备很多,比如语音视频设备、摄像头等,因…

【数据结构】常见的几种数据结构

常见的数据结构:数组、链表、队列、栈、、堆、二叉树、B树、哈希表、图 数组 因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来。根据索引查找元素,时间复杂度是 \(O(1)\)。 动态数组动态数组具体代码实现 import java.util.Arrays; import java…

QT6.7.2 MSVC源码编译 静态库 动态库

QT6.7.2 MSVC源码编译 静态库 动态库 也可以参考官方的文档 https://doc.qt.io/qt-6/build-sources.html 环境搭建 为了操作更有可复制性,这里在虚拟机中采用全新安装的系统进行配置。 系统镜像为:en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96_2.iso 安装 Visual…

CPU管理 多进程图像

CPU管理 && 多进程图像 要管理CPU,先要学会使用CPU CPU的工作方式在操作系统学习之初就已经提过:取值执行程序存放在内存中,每段指令对应一个地址 CPU发出取指命令,将想取地址通过地址总线传到PC 内存根据地址取出对应地址的指令 从总线传回,CPU解释执行总之,就是…

电子显微镜对生物的观察

某黄色小虫,大概 \(100μm \times 400μm\) 的样子。

ARM Cortex-A 与 STM32 F107

ARM Cortex-A 和 STM32 F107 是两种不同的微控制器架构,它们在性能、应用场景和硬件支持方面有很大的差异。以下是它们的详细比较和分析: 1. 基本特性比较ARM Cortex-A 系列ARM Cortex-A 是 ARM 架构中的高级应用处理器系列,专为复杂的计算任务和高级应用设计。它广泛用于智…

前端开发 | Node 版本管理器选择

一、Nvm nvm 是一款 Node.js 版本管理工具,允许用户通过命令行快速安装、切换和管理不同的 Node.js 版本。nvm 只适用于 macOS 和 Linux 用户的项目,如果是 Windows 用户,可以使用 nvm-windows 、nodist或 nvs 替换。 安装方式 macOS 下载方式: brew install nvm # or sh 命…

示波器基本使用方法

示波器 示波器的基本使用方法首先检查示波器包装中是否有下列物品:• 示波器。 • 电源线。 • N2841A 10:1 10 MΩ 无源探头,数量= 2连接电源和信号源:将示波器的电源插入电源插座,并确保电源适配器或电池充足。 将需要测量的信号源(例如电路板、信号发生器等)连接到示波…