Solution - Codeforces 1681E Labyrinth Adventures

news/2024/11/14 21:56:40/文章来源:https://www.cnblogs.com/rizynvu/p/18546867

能够发现这个最短路的形态一定是从低层一层一层走到高层的。

那么这就说明若起点终点对应层数为 \(x, y\)
\(x = y\) 则直接算,就是曼哈顿距离。
否则不妨钦定 \(x < y\)(不满足就交换,不影响结果),那么层数 \(z\in [x, y)\) 的其中一个门肯定都会被经过。

于是考虑把 \(\operatorname{dis}((x_1, y_1), (x_2, y_2))\) 拆成到同一层两个门的距离的和的最小值。
记在路径之中经过的其中一层的两个门为 \((x_3, y_3), (x_4, y_4)\),那么就可以拆成 \(\min\{\operatorname{dis}((x_1, y_1), (x_3, y_3)) + \operatorname{dis}((x_3, y_3), (x_2, y_2)), \operatorname{dis}((x_1, y_1), (x_4, y_4)) + \operatorname{dis}((x_4, y_4), (x_2, y_2))\}\)

同时对于 \(\operatorname{dis}((x_1, y_1), (x_3, y_3))\) 也可以继续拆下去。
\((x_1, y_1)\) 所在层的两个门为 \((x_5, y_5), (x_6, y_6)\),那么可以类似的拆为 \(\min\{\operatorname{dis}((x_1, y_1), (x_5, y_5)) + \operatorname{dis}((x_5, y_5), (x_3, y_3)), \operatorname{dis}((x_1, y_1), (x_6, y_6)) + \operatorname{dis}((x_6, y_6), (x_3, y_3))\}\)

对于 \(\operatorname{dis}((x_1, y_1), (x_5, y_5))\) 因为同层关系就是好算的了。

于是能够发现只需要知道门的最短路距离就可以得到答案了。

但是考虑到门的个数还是 \(\mathcal{O}(n)\) 的,直接跑还是不太行。
但是注意到每次询问对应的是一个区间,于是可以考虑分治。

具体的,考虑处理到 \([l, r]\),那么记 \(m = \lfloor\frac{l + r}{2}\rfloor\)
考虑就以 \(m\) 层的门为起点,跑出与其他 \([l, r]\) 层内的门的最短路。
那么对于一个层数在 \([x, y](l\le x\le y\le r)\) 的询问,若这个层数跨过了 \(m\) 层的门,即 \(x\le m < y\),那么就可以在此统计贡献了。

对于还没有统计到的询问,考虑分成两部分 \([l, m], (m, r]\),继续递归下去处理。

时间复杂度 \(\mathcal{O}((n + q)\log n)\)

#include<bits/stdc++.h>
using ll = long long;
constexpr ll inf = 1e18;
constexpr inline int dis(int x1, int y1, int x2, int y2) {return abs(x1 - x2) + abs(y1 - y2);
}
constexpr inline int dep(int x, int y) {return std::max(x, y);
}
using Z = std::tuple<int, int, int, int, int>;
constexpr int maxn = 1e5 + 10, maxm = 2e5 + 10;
int dx[maxn][2], dy[maxn][2];
ll ans[maxm];
ll f[2][maxn][2];
inline void solve(int l, int r, std::vector<Z> qry) {if (l >= r) return ;int mid = l + r >> 1;for (int op : {0, 1}) {auto d = f[op];d[mid][op] = 0, d[mid][op ^ 1] = dis(dx[mid][0], dy[mid][0], dx[mid][1], dy[mid][1]);for (int i = mid - 1; i >= l; i--) {d[i][0] = 1ll + std::min(d[i + 1][0] + dis(dx[i][0] + 1, dy[i][0], dx[i + 1][0], dy[i + 1][0]), d[i + 1][1] + dis(dx[i][0] + 1, dy[i][0], dx[i + 1][1], dy[i + 1][1]));d[i][1] = 1ll + std::min(d[i + 1][0] + dis(dx[i][1], dy[i][1] + 1, dx[i + 1][0], dy[i + 1][0]),d[i + 1][1] + dis(dx[i][1], dy[i][1] + 1, dx[i + 1][1], dy[i + 1][1]));}for (int i = mid + 1; i < r; i++) {d[i][0] = 1ll + std::min(d[i - 1][0] + dis(dx[i - 1][0] + 1, dy[i - 1][0], dx[i][0], dy[i][0]),d[i - 1][1] + dis(dx[i - 1][1], dy[i - 1][1] + 1, dx[i][0], dy[i][0]));d[i][1] = 1ll + std::min(d[i - 1][0] + dis(dx[i - 1][0] + 1, dy[i - 1][0], dx[i][1], dy[i][1]),d[i - 1][1] + dis(dx[i - 1][1], dy[i - 1][1] + 1, dx[i][1], dy[i][1]));}}std::vector<Z> qryL, qryR;for (auto [x1, y1, x2, y2, id] : qry) {int dep1 = dep(x1, y1), dep2 = dep(x2, y2);if (dep1 <= mid && mid < dep2) {ans[id] = inf;for (int op : {0, 1}) {auto d = f[op];ll d1 = std::min(d[dep1][0] + dis(x1, y1, dx[dep1][0], dy[dep1][0]), d[dep1][1] + dis(x1, y1, dx[dep1][1], dy[dep1][1]));ll d2 = std::min(d[dep2 - 1][0] + dis(x2, y2, dx[dep2 - 1][0] + 1, dy[dep2 - 1][0]),d[dep2 - 1][1] + dis(x2, y2, dx[dep2 - 1][1], dy[dep2 - 1][1] + 1));ans[id] = std::min(ans[id], 1ll + d1 + d2);}} else if (dep2 <= mid) {qryL.emplace_back(x1, y1, x2, y2, id);} else {qryR.emplace_back(x1, y1, x2, y2, id);}}solve(l, mid, qryL), solve(mid + 1, r, qryR);
}
int main() {int n, m;scanf("%d", &n);for (int i = 1; i < n; i++) {for (int j : {0, 1}) {scanf("%d%d", &dx[i][j], &dy[i][j]);}}scanf("%d", &m);std::vector<Z> qry;for (int i = 1; i <= m; i++) {int qx[2], qy[2];scanf("%d%d%d%d", &qx[0], &qy[0], &qx[1], &qy[1]);if (dep(qx[0], qy[0]) == dep(qx[1], qy[1])) {ans[i] = dis(qx[0], qy[0], qx[1], qy[1]);continue;}if (dep(qx[0], qy[0]) > dep(qx[1], qy[1])) {std::swap(qx[0], qx[1]), std::swap(qy[0], qy[1]);}qry.emplace_back(qx[0], qy[0], qx[1], qy[1], i);}solve(1, n, qry);for (int i = 1; i <= m; i++) {printf("%lld\n", ans[i]);}return 0;
}

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

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

相关文章

Alpha冲刺(2/14)——2024.11.13

目录一、团队成员分工与进度二、成员任务问题及处理方式三、冲刺会议内容记录会议内容四、GitHub签入记录及项目运行截图GitHub签入记录项目运行截图五、项目开发进展及燃尽图项目开发进展燃尽图六、团队成员贡献表 一、团队成员分工与进度成员 完成的任务 完成的任务时长 剩余…

PS端Flash固化

PS端Flash固化Vivado版本:Vivado2020.2 芯片型号:RFSoC XCZU47DR 前提条件:Vitis工程编译完成,拨码开关拨到PS JTAG模式创建引导镜像 首先右键应用工程系统,点击Create Boot Image。检查镜像工程的文件是否为固化需要的工程文件,点击创建镜像的选项即可完成创建,创建完成…

Office Word 文档格式与目录样式(毕业设计论文常用)

调整格式技巧: Word 中点击 “文件”--》"选项"--》“显示”,将高亮部分全部打钩,有利于查看格式字符、 “分页符” 和“分节符” 两个很有用, 其中分节符 前后的页码是独立的。 样式间的关系: 类比 C++ 中类的继承编写的伪代码,“正文”为基类,派生出 “论文…

想不到新版的onenote配色这么好看

原来一直在用office自带的onenote,想不到新版的onenote配色这么好看。

[豪の学习笔记] 计算机网络#001

计算机网络概念、网络协议、计算机网络结构、Internet结构、电路交换、多路复用、报文交换与分组交换1.1.1 - 什么是计算机网络 计算机网络 = 通信技术 + 计算机技术计算机网络就是一种特殊的通信网络 定义:计算机网络就是互联的、自治的计算机集合 自治:无主从关系 互联:互…

第十一次作业

1、RCE:分别实现ThinkPHP、Weblogic、Shiro漏洞的利用过程> ThinkPHP: 环境搭建前端测试是否存在pearcmd,访问路径,存在的话报错就确认存在在根目录下创建magedu3.php这个文件,文件内容为<?=phpinfo()?>,10.0.0.150:8080/public/?lang=../../../../../../../.…

Python并行编程1并行编程简介(上)高频面试题:GIL进程线程协程

1 并行编程简介 首先,我们将讨论允许在新计算机上并行执行的硬件组件,如 CPU 和内核,然后讨论操作系统中真正推动并行的实体:进程和线程。随后,将详细说明并行编程模型,介绍并发性、同步性和异步性等基本概念。 介绍完这些一般概念后,我们将讨论全局解释器锁(GIL)及其…

鸿蒙NEXT开发案例:年龄计算

​ 【引言】 本案例的目标是开发一款年龄计算器应用,该应用能够根据用户输入的出生日期,计算出用户的实际年龄、虚岁、星座、生肖等信息。同时,应用还将提供距离下次公历和农历生日的天数及星期等信息。为了实现这些功能,我们将使用ArkTS和ArkUI作为开发语言,并借助@nutpi…

Dosbox-x安装WinXP——图文教程

很多老游戏只能在win95、98或者XP中运行,因此,很多人尝试将Win95、98安装到Dosbox中,利用Dosbox来玩那些久远的情怀。有Win98自然就有人想在Dosbox中安装更高级的Win系统,于是就有人尝试在Dosnox中安装Win2000、WinXP的,其中2023-07-03在国外的fabulous.systems出现了一篇…

ABB AC900F学习笔记331:使用ST做自定义功能块,计算最近60秒的分钟均值和最近60分钟的小时均值

前面自己学习了在西门子TIA使用SCL编程,施耐德Unity中使用ST编程做分钟均值和小时均值的方法,今晚在家练习了在ABB Freelance中自定义功能块使用ST语言做分钟均值和小时均值。 新建项目、插入硬件、仿真器、操作站等不做介绍。新建一个用户功能块池,下面建一个功能块类。功能…

DBeaver如何设置自动刷新数据库表的数据,彻底解放双手!

前言 大家好,我是小徐啊。 DBeaver是一款常用的数据库连接工具,它的优点是免费使用,而且支持的数据库类型超级多,甚至可以直接安装数据库对应的驱动jar包来连接数据库。 比如达梦数据库,之前版本是可以通过jar包方式设置驱动来连接达梦数据库的。好了,言归正传,今天小徐…

Intellij IDEA如何设置中文版?安装中文汉化包插件?失败问题解决!

前言 大家好,我是小徐啊。 Intellij IDEA默认是英文的操作界面,因为是外国人开发的嘛~对于英文好一点的同学来说,英文就英文吧,但对于英文比较差的同学,就还是希望能够汉化一下,变成熟悉的中文。今天小徐就来介绍下如何在IDEA中安装汉化插件,以及在这过程中,我遇到的奇…