CF1993F2 Dyn-scripted Robot (Hard Version)

news/2025/1/10 19:11:03/文章来源:https://www.cnblogs.com/Pengzt/p/18664555

Dyn-scripted Robot (Hard Version)

题目链接。

Problem

Easy Version:\(K \le n\)

Hard Version:\(K \le 10^{12}\)

一个 \(Oxy\) 平面上有一个 \(w \times h\) 矩形,矩形的左下方有点 \((0, 0)\) ,右上方有点 \((w, h)\)

您还有一个最初位于点 \((0, 0)\) 的机器人和一个由 \(n\) 个字符组成的脚本 \(s\) 。每个字符都是 L、R、U 或 D,分别指示机器人向左、向右、向上或向下移动。

机器人只能在矩形内移动,否则将更改脚本 \(s\) 如下:

  • 如果试图向垂直边界外移动,则会将所有 LR 取反。
  • 如果尝试向水平边界外移动,则会将所有 UD 取反。

然后,它会从无法执行的字符开始执行更改后的脚本。

这是一个机器人移动过程的示例,其中 \(s = \texttt{"ULULURD"}\)

脚本 \(s\) 将被连续执行 \(K\) 次。即使重复执行,也会保留对字符串 \(s\) 的所有更改。在此过程中,机器人总共会移动到 \((0, 0)\) 点多少次?

注意,初始在 \((0,0)\) 的一次不计算在内

数据范围:\(1\le n, w, h \le 10^6\)

Sol

暴力显然是不可行的。发现这个东西会时刻将 LR/UD 取反是非常麻烦的。想想怎么不去反,发现抛开边界的限制,不取反就是做一个关于 \(x/y\) 轴的镜像。然后发现这个东西在 \((x, y)\)\((x - 2w, y), (x, y - 2h)\) 是等价的,即在两倍意义下同余。然后就可以做了。现在要对于一个点 \((x, y)\),以及每次移动的位置 \((a, b)\),求移动 \(k\) 次的过程中,有多少次的坐标等价于 \((0, 0)\)

然后 Easy Version 就可以直接枚举走的步数,用 map 存下每个点的位置,计算偏移量后暴力相加即可,时间复杂度:\(\mathcal{O}(K(\log w + \log h))\)

Hard Version 也差不多。就是知道 \(x\) 在同余系下走到 \(0\) 的轮数为 \(k_0x + b_0\)\(y\)\(k_1x+b_1\),大致就是最开始是第 \(b\) 轮的时候开始走,然后每 \(k\) 轮走回来。然后求的是有多少个 \(t \in [1, K]\),使得 \(\exists u,v \in [1, n] \cap \mathbb Z,t = k_0u + b_0 = k_1v + b_1\)。然后就变成了 \(k_0u - k_1v = b_0 - b_1\),直接用 exgcd 解出一组特解之后就可以直接算了。时间复杂度:\(\mathcal{O}(n \log K)\)

感觉这场 Hard Version 能有 *2800 完全是因为这题细节有一点啊,就只是比 Easy Version 多了合并循环节的步骤。

Code

F2 Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define fi first
#define se second
mt19937_64 eng(time(0) ^ clock());
template <typename T>
T rnd(T l, T r) { return eng() % (r - l + 1) + l; }
ll exgcd(ll a, ll b, ll &x, ll &y) {if (!b)return x = 1, y = 0, a;ll d = exgcd(b, a % b, y, x);y -= a / b * x;return d;
}
ll lcm(ll x, ll y) { return x * y / __gcd(x, y); }
int n;
ll w, h, K;
int px[1000005], py[1000005];
char s[1000005];
void Solve() {scanf("%d%lld%lld%lld%s", &n, &K, &w, &h, s + 1); K--;w <<= 1, h <<= 1;px[0] = py[0] = 0;for (int i = 1; i <= n; i++) {px[i] = px[i - 1], py[i] = py[i - 1];if (s[i] == 'L') px[i]--;else if (s[i] == 'R') px[i]++;else if (s[i] == 'U') py[i]++;else py[i]--;px[i] = (px[i] % w + w) % w;py[i] = (py[i] % h + h) % h;}ll dx = px[n], dy = py[n], ans = 0;for (int i = 1; i <= n; i++) {ll x, y;ll d0 = exgcd(dx, w, x, y);if (px[i] % d0)continue;ll b0 = x * (-px[i] / d0), k0 = w / __gcd(w, dx);b0 = (b0 % k0 + k0) % k0;ll d1 = exgcd(dy, h, x, y);if (py[i] % d1)continue;ll b1 = x * (-py[i] / d1), k1 = h / __gcd(h, dy);b1 = (b1 % k1 + k1) % k1;ll d = exgcd(k0, k1, x, y), len = lcm(k0, k1) / k0, dltx = lcm(k0, k1) / k0, dlty = lcm(k0, k1) / k1;if ((b1 - b0) % d)continue;x *= (b1 - b0) / d, y *= (b1 - b0) / d;if (y < 0) {ll t = (-y + dlty - 1) / dlty;x -= t * dltx, y += t * dlty;}if (y > 0) {ll t = (y + dlty - 1) / dlty;x += t * dltx, y -= t * dlty;}if (k0 * x + b0 > K)continue;ll limx = (K - b0) / k0;ans += (limx - x) / len + 1;}printf("%lld\n", ans);
}
int main() {int T;scanf("%d", &T);while (T--)Solve();return 0;
}

F1 Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 7;
int n, m, W, H, m1, m2;
int s1[N], s2[N];
char str[N];
map < int, int > mp[N << 1];
void Solve() {scanf("%d%d%d%d", &n, &m, &W, &H);m1 = 2 * W, m2 = 2 * H;scanf("%s", str + 1);for (int i = 1; i <= n; ++i) {s1[i] = s1[i - 1], s2[i] = s2[i - 1];if (str[i] == 'L') s1[i] = (s1[i - 1] + 1) % m1;else if (str[i] == 'R') s1[i] = (s1[i - 1] - 1 + m1) % m1;else if (str[i] == 'U') s2[i] = (s2[i - 1] + 1) % m2;else s2[i] = (s2[i - 1] - 1 + m2) % m2;++mp[s1[i]][s2[i]];}ll ans = 0;for (int t = 0; t < m; ++t) {int r1 = (m1 - t * 1ll * s1[n] % m1) % m1, r2 = (m2 - t * 1ll * s2[n] % m2) % m2;ans += mp[r1][r2];}printf("%lld\n", ans);for (int i = 1; i <= n; ++i) mp[s1[i]].clear();
}
int main() {int T;scanf("%d", &T);while (T--) Solve();return 0;
}

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

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

相关文章

OmniNxt 论文阅读

来源: https://arxiv.org/html/2403.20085?_immersive_translate_auto_translate=1 标题: OmniNxt: A Fully Open-source and Compact Aerial Robot with Omnidirectional Visual Perception OmniNxt 感觉是, 取自 Omnidirectional 中 全的意思, Nxt 像是 Next 的意思,表…

2024-12-1-#{}与¥{}的区别-response

{}与¥{}的区别response实现重定向response响应字符数据response响应字节数据以及导入工具类实现响应

手动部署前后端分离的项目到本地

1.准备工作 使用maven打包springboot项目为.jar文件得到springboot-0.0.1-SNAPSHOT.jar打包vue项目 npm install -g @vue/cli安装Vue CLI 在项目根目录下,运行npm run build命令来构建项目得到一个dist文件夹将打包好的文件通过远程仓库中转至docker虚拟机在虚拟机拉取镜像,并…

nvm 安装进行node多版本管理及环境变量配置

注意: 1、安装nvm之前需要卸载之前的nodejs,并且还要删除之前的环境变量配置,否则会出现一些奇怪的问题 2、nvm的安装路径不能有中文或者空格,否则后面在cmd中切换node版本会出现乱码 一、完全卸载旧的nodejs 参考文章《Node卸载超详细步骤》 1、打开系统的控制面板,点击卸…

M5Stack 发布全双工通信语音识别硬件;雷蛇发布 AI 游戏伴侣 Project AVA,实时指导复盘

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

WPF 怎么利用behavior优雅的给一个Datagrid添加一个全选的功能

前言:我在迁移旧项目代码的时候发现别人写很多界面都涉及到一个DataGrid的全选,但是每个都写的很混乱,现在刚好空闲下来,写一个博客, 给部分可能不太会写这个的同学讲一下,怎么实现全选功能,并且可以在任何项目里面复用这个功能。 先准备一个Datagrid,我们给这个DataGr…

使用chai3d-GEL模块进行软体模型力反馈仿真的一点碎片化记录

在要模拟的网格模型中手动添加节点或者对于形状比较复杂的模型使用TetGen之类的网格划分程序自动添加节点和连接;然后设置合理的仿真参数(质量、刚度、重力、时间步长...) 骨架驱动:SkeletonModel 使用骨架结构来表示变形体。骨架由一系列节点(cGELSkeletonNode)和连接这…

销售新手必看:七大关键要素助你快速蜕变行业精英

在销售领域的探索之路上,我时常遇到新入行的同仁们询问如何迅速提升自我。回望自己初涉销售的时光,那段没有专业背景支撑,也缺乏资深前辈指引的日子,我选择了最质朴的方式——埋首于书店中,搜寻销售相关的书籍。然而,那些偏重理论研究的书籍,并未给予我太多实战中的助力…

电机控制的数字化升级:基于DSP和FPGA的仿真与实现

​数字信号处理器(DSP,Digital Signal Processor)在工业自动化领域的应用日益广泛。DSP是一种专门用于将模拟信号转换成数字信号并进行处理的技术,能够实现信号的数字滤波、重构、调制和解调等多项功能,确保信号处理的精确性和稳定性。特别是在电机控制系统中,DSP的应用尤…

中考英语优秀范文-热点话题-传统文化-001 Chinese Treasures: Opera Paper Art 国宝探秘:京剧与剪纸

1 写作要求 坚定文化自信,弘扬中华优秀传统文化,做中华文明的传播者是新时代中国青少年的责任与使命。假如你是李华,近期,一批外国朋友要到你所在的学校参观访问,请用英语写一篇发言稿,向他们介绍中华优秀传统文化。 内容包括: 1 欢迎朋友们的到来; 2 总体介绍中国传统…

货梯载人监控报警自动停梯系统

货梯载人监控报警自动停梯系统利用安装在货梯轿厢内的监控摄像头,实时捕捉轿厢内的画面信息,货梯载人监控报警自动停梯系统一旦确认有人员进入货梯轿厢监测范围内,系统便会迅速输出报警信号。同时,与电梯控制系统实现联动,强制电梯不关门、不运行,从而将人员拒之于危险之…

【YashanDB知识库】使用DBeaver 插入数据 nvarchar字段插入为空

本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7901516.html?templateId=1718516 【问题分类】DBeaver使用 【关键字】DBeaver、nvarchar 【问题描述】使用DBeaver ,插入数据nvarchar字段插入为空。其他字段都有数据,且插入没有报错。【问题原…