当前位置: 首页 > news >正文

Robot Queries

题目传送门

前置知识——向量的加减

\((x_1,y_1) \pm (x_2,y_2) = (x_1\pm x_2,y_1\pm y_2)\)

满足交换律和结合律。

题目大意

有一个在 \((0,0)\) 的点。现在给出 \(n\) 个操作序列 \({f}\),每个指令形如 \((x, y) \gets \left\{\begin{matrix}(x \pm 1, y) \\(x, y \pm 1)\end{matrix}\right.\)。现在又有 \(q\) 个互相独立的询问,每个询问为反转 \(a_l\sim a_r\),给出 \((x, y)\) 是否被点经过。

思路

一、操作序列等价于一组向量:\(\{(\pm 1,0),(0,\pm 1)\}\)。对于每一个询问,等价于询问反转后的操作序列 \({b}\) 是否有 \((x, y) = \sum_{i - 1}^n b_i\)。设 \(a_i = \sum_{j=1}^i f_j\)

二、由向量加法满足交换律容易得到 \(\forall p\in[1,l)\cup[r,n], a_p \text{不变}\)。所以其中一种合法情况为 \(a_i\) 等于 \((x, y)\)\(\forall p\in[1,l)\cup[r,n]\)

三、由找规律可得,反转一段区间等价于将这一段的路径 \(\{b\}\) 旋转 \(180^{\circ}\) 再把 \({b}\) 的起点平移到 \(a_{l-1}\)。所以另外一种合法情况为 \(a_{l - 1} + a_r - (x, y) = b_p\)\(\forall p \in [l, r)\)

实现

使用一个 map<PII, vector<int>> mp 维护 \(b = a_i\)\(i\)。对于第一种情况,直接判断 mp[{x, y}] 中是否有 \(p\in[1,l)\cup[r,n]\) 即可。对于第二种情况,判断 mp[add(add(re(p), a[l - 1]), a[r])] 中是否有 \(p\in[l,r)\) 即可。判断可以使用二分。

code

#include <bits/stdc++.h>#pragma GCC optimize("Ofast")#define int long longusing namespace std;const int N = 2e5 + 5;using PII = pair<int, int>;int n, q, x, y, l, r;
PII a[N];
map<PII, vector<int>> mp;PII add(PII x, PII y) {return {x.first + y.first, x.second + y.second};
}
PII re(PII x) {return {-x.first, -x.second};
}
bool check(vector<int> &v, int l, int r) {auto it = lower_bound(v.begin(), v.end(), l);if (it == v.end()) return false;return *it <= r;
}signed main() {cin.tie(0)->sync_with_stdio(0);cin >> n >> q;mp[{0, 0}].push_back(0);for (int i = 1; i <= n; i ++ ) {char ch;    cin >> ch;if (ch == 'U') {a[i] = {a[i - 1].first, a[i - 1].second + 1};} else if (ch == 'D') {a[i] = {a[i - 1].first, a[i - 1].second - 1};} else if (ch == 'L') {a[i] = {a[i - 1].first - 1, a[i - 1].second};} else {a[i] = {a[i - 1].first + 1, a[i - 1].second};}mp[a[i]].push_back(i);}while (q -- ) {cin >> x >> y >> l >> r;PII p = {x, y};if (mp.count(p) && (check(mp[p], 0, l - 1) || check(mp[p], r, n))) {cout << "YES\n";continue;}PII finded = add(add(re(p), a[l - 1]), a[r]);if (mp.count(finded) && check(mp[finded], l, r - 1)) {cout << "YES\n";continue;}cout << "NO\n";}return 0;
}
http://www.hn-smt.com/news/414/

相关文章:

  • 10月27日
  • javascript构造对象数组向服务器端传输
  • 10.25 CSP-S 模拟赛
  • 鲜花10/27
  • 读《程序员的修炼之路:从小工到专家》有感
  • 想让默认头像不再千篇一律,就顺手复刻了一下 GitHub 的思路
  • java(3)基础规范
  • 读书日记3
  • Tuack 生成 OI 比赛题目 PDF 笔记
  • 数据库三大范式、Union和Union all的区别
  • CSP-S2025 游记
  • 「LG3600-随机数生成器」题解
  • MathType7下载包安装教程2025最新下载+安装+汉化激活(附安装包,超详细)
  • 2025强网杯ezphp复现
  • 漏洞报告被拒绝的常见原因及避免方法
  • 【IEEE出版 | 重庆邮电大学主办 | 多届次、高层次】第六届人工智能与计算机工程国际学术会议(ICAICE 2025)
  • Docker容器里面部署的Jenkins的Java17升级到21版本(无需删除之前容器,内部在线升级) - 攻城狮
  • 报表知识
  • 渐进过程中大O与小o混用
  • 消息队列的有序性
  • 【LTDC】DMA2D —— 嵌入式系统的 GPU
  • unity管理器设计:Manager of Managers
  • iview table 排序 columns 里面写 sortable: custom 不要写 sortable: true 不然会进行二次内部排序序号等 字段。
  • 本地运行nginx服务,模拟线上环境访问项目
  • git提交远程项目步骤
  • 2025 年搅拌器搅拌设备,侧入式搅拌设备,斜插式揽拌设备,卧式搅拌设备厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读
  • 2025 年环保搅拌设备,搅拌装置设备,框式搅拌设备厂家最新推荐,实力品牌深度解析采购无忧之选!
  • CorelDRAW的shell扩展ShellXP.dll导致资源管理器explorer.exe卡死/冻结/无响应/挂起
  • 2025 年定制矿车,大型矿车,固定式矿车厂家最新推荐,产能、专利、环保三维数据透视
  • 醒图电脑版下载与安装教程(2025最新版)