1 条题解
-
0
题目详解
问题重述
我们需要在最多 次操作内,通过每次操作后得到的“当前点到最近锚点的曼哈顿距离”这一信息,反推出机器人的初始坐标 。
设 ,保证 。
核心思想
曼哈顿距离与 旋转后的切比雪夫距离之间存在经典变换。定义:
则原坐标系中的曼哈顿距离可表示为:
$$|x_i - X| + |y_i - Y| = \max(|u_i - U|, |v_i - V|) $$其中 ,。
因此,原问题转化为:在 坐标系下,有 个点 ,机器人初始位置为 ,每次移动后得到的是当前点与所有锚点之间的切比雪夫距离最小值。
操作在 坐标系中的对应
在原始坐标系中的四种移动,对应到 坐标系的变化如下:
原始操作 变化 变化 右移 左移 上移 下移 可见,在 坐标系中,我们无法独立调整 和 ,但可以控制它们的和与差。
获取
考虑执行以下四次操作:
- 左移 单位
- 左移 单位
- 下移 单位
- 下移 单位
设初始坐标为 ,经过这四次操作后,机器人位置变为:
由于 ,有 ,。
此时对于任意锚点 ,由于 ,,所以:
$$|x_i - X'| + |y_i - Y'| = (x_i - X') + (y_i - Y') = (x_i + y_i) - (X' + Y') $$因此,评审团返回的距离为:
$$\begin{aligned} \text{res}_1 &= \min_{1 \le i \le n} \left( (x_i + y_i) - (X' + Y') \right) \\ &= \min_{1 \le i \le n} (x_i + y_i) - (X' + Y') \end{aligned} $$而 ,代入得:
$$\text{res}_1 = \min_{1 \le i \le n} (x_i + y_i) - (X + Y) + 4V $$记 ,则:
获取
考虑执行以下四次操作:
- 左移 单位
- 左移 单位
- 上移 单位
- 上移 单位
经过这四次操作后,机器人位置变为:
此时 ,。
对于任意锚点 ,有
实际上,我们需要保证机器人位于所有锚点的左上方,即 且 对所有 成立。
由于 ,而 ,所以 成立。
由于 ,而 ,所以 成立。因此,此时对于任意锚点,有 且 ,所以:
$$|x_i - X'| + |y_i - Y'| = (x_i - X') + (Y' - y_i) = (Y' - X') + (x_i - y_i) $$于是评审团返回的距离为:
$$\begin{aligned} \text{res}_2 &= \min_{1 \le i \le n} \left( (Y' - X') + (x_i - y_i) \right) \\ &= (Y' - X') + \min_{1 \le i \le n} (x_i - y_i) \end{aligned} $$计算 $Y' - X' = (Y + 2V) - (X - 2V) = Y - X + 4V = -(X - Y) + 4V$。
记 ,则:
因此:
另一种对称做法(与标程一致)
标程中采用的是另一种对称的操作序列来获取 :
执行以下四次操作:
- 右移 单位
- 右移 单位
- 上移 单位
- 上移 单位
经过这四次操作后,机器人位置变为:
此时 ,,机器人位于所有锚点的右上方。
对于任意锚点 ,有 ,,所以:
$$|x_i - X'| + |y_i - Y'| = (X' - x_i) + (Y' - y_i) = (X' + Y') - (x_i + y_i) $$于是:
$$\begin{aligned} \text{res}_2 &= \min_{1 \le i \le n} \left( (X' + Y') - (x_i + y_i) \right) \\ &= (X' + Y') - \max_{1 \le i \le n} (x_i + y_i) \end{aligned} $$而 ,所以:
$$\text{res}_2 = X + Y + 4V - \max_{1 \le i \le n} (x_i + y_i) $$这给出的是 的另一个表达式,而不是 。因此标程实际使用了不同的操作序列来获取 。
正确方案:获取 的另一种方法
执行以下四次操作:
- 右移 单位
- 右移 单位
- 下移 单位
- 下移 单位
经过这四次操作后,机器人位置变为:
此时 ,,机器人位于所有锚点的右下方。
对于任意锚点 ,有 ,,所以:
$$|x_i - X'| + |y_i - Y'| = (X' - x_i) + (y_i - Y') = (X' - Y') - (x_i - y_i) $$于是:
$$\begin{aligned} \text{res}_2 &= \min_{1 \le i \le n} \left( (X' - Y') - (x_i - y_i) \right) \\ &= (X' - Y') - \max_{1 \le i \le n} (x_i - y_i) \end{aligned} $$计算 。
记 ,则:
因此:
最终方案
操作序列
第一步:获取
执行四次操作:两次左移 ,两次下移 。
得到返回值 ,计算:
$$X + Y = \min_{1 \le i \le n} (x_i + y_i) + 4V - \text{res}_1 $$第二步:获取
执行四次操作:两次右移 ,两次下移 。
得到返回值 ,计算:
$$X - Y = \max_{1 \le i \le n} (x_i - y_i) - 4V + \text{res}_2 $$解出初始坐标
$$X = \frac{(X + Y) + (X - Y)}{2}, \quad Y = \frac{(X + Y) - (X - Y)}{2} $$总共使用 次操作,满足 的限制。
代码实现
#include <bits/stdc++.h> using namespace std; using ll = long long; const ll V = 1000000000; void solve() { int n; cin >> n; ll sum_min = LLONG_MAX; // min(x_i + y_i) ll diff_max = LLONG_MIN; // max(x_i - y_i) for (int i = 0; i < n; i++) { ll x, y; cin >> x >> y; sum_min = min(sum_min, x + y); diff_max = max(diff_max, x - y); } ll res1, res2; // 四次操作:两次左移 V,两次下移 V,得到 X+Y cout << "? L " << V << endl; cin >> res1; cout << "? L " << V << endl; cin >> res1; cout << "? D " << V << endl; cin >> res1; cout << "? D " << V << endl; cin >> res1; ll sum_ans = sum_min + 4 * V - res1; // 四次操作:两次右移 V,两次下移 V,得到 X-Y cout << "? R " << V << endl; cin >> res2; cout << "? R " << V << endl; cin >> res2; cout << "? D " << V << endl; cin >> res2; cout << "? D " << V << endl; cin >> res2; ll diff_ans = diff_max - 4 * V + res2; ll X = (sum_ans + diff_ans) / 2; ll Y = (sum_ans - diff_ans) / 2; cout << "! " << X << " " << Y << endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); int T; cin >> T; while (T--) { solve(); } return 0; }
正确性验证
推导
机器人经过两次左移 和两次下移 后,位置为 。由于 ,有 ,。对所有锚点 ,,,因此 ,。
曼哈顿距离:
$$|x_i - (X - 2V)| + |y_i - (Y - 2V)| = (x_i - X + 2V) + (y_i - Y + 2V) = (x_i + y_i) - (X + Y) + 4V $$取最小值:
$$\Rightarrow X + Y = \min_i (x_i + y_i) + 4V - \text{res}_1 $$推导
机器人经过两次右移 和两次下移 后,位置为 。由于 ,有 ,。对所有锚点 ,,,因此 ,。
曼哈顿距离:
$$|x_i - (X + 2V)| + |y_i - (Y - 2V)| = (X + 2V - x_i) + (y_i - Y + 2V) = (X - Y) + 4V - (x_i - y_i) $$取最小值:
$$\text{res}_2 = \min_i \left( (X - Y) + 4V - (x_i - y_i) \right) = (X - Y) + 4V - \max_i (x_i - y_i) $$$$\Rightarrow X - Y = \max_i (x_i - y_i) - 4V + \text{res}_2 $$推导完毕。
- 1
信息
- ID
- 6220
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者