1 条题解

  • 0
    @ 2026-4-2 0:07:32

    题目详解

    问题重述

    我们需要在最多 1010 次操作内,通过每次操作后得到的“当前点到最近锚点的曼哈顿距离”这一信息,反推出机器人的初始坐标 (X,Y)(X, Y)

    V=109V = 10^9,保证 VX,YV-V \le X, Y \le V


    核心思想

    曼哈顿距离与 4545^\circ 旋转后的切比雪夫距离之间存在经典变换。定义:

    u=x+y,v=xyu = x + y, \quad v = x - y

    则原坐标系中的曼哈顿距离可表示为:

    $$|x_i - X| + |y_i - Y| = \max(|u_i - U|, |v_i - V|) $$

    其中 U=X+YU = X + YV=XYV = X - Y

    因此,原问题转化为:在 (u,v)(u, v) 坐标系下,有 nn 个点 (ui,vi)(u_i, v_i),机器人初始位置为 (U,V)(U, V),每次移动后得到的是当前点与所有锚点之间的切比雪夫距离最小值。


    操作在 (u,v)(u, v) 坐标系中的对应

    在原始坐标系中的四种移动,对应到 (u,v)(u, v) 坐标系的变化如下:

    原始操作 (X,Y)(X, Y) 变化 (U,V)(U, V) 变化
    右移 kk (+k,0)(+k, 0) (+k,+k)(+k, +k)
    左移 kk (k,0)(-k, 0) (k,k)(-k, -k)
    上移 kk (0,+k)(0, +k) (+k,k)(+k, -k)
    下移 kk (0,k)(0, -k) (k,+k)(-k, +k)

    可见,在 (u,v)(u, v) 坐标系中,我们无法独立调整 UUVV,但可以控制它们的和与差。


    获取 U=X+YU = X + Y

    考虑执行以下四次操作:

    1. 左移 VV 单位
    2. 左移 VV 单位
    3. 下移 VV 单位
    4. 下移 VV 单位

    设初始坐标为 (X,Y)(X, Y),经过这四次操作后,机器人位置变为:

    X=X2V,Y=Y2VX' = X - 2V, \quad Y' = Y - 2V

    由于 VX,YV-V \le X, Y \le V,有 XVX' \le -VYVY' \le -V

    此时对于任意锚点 (xi,yi)(x_i, y_i),由于 xiVXx_i \ge -V \ge X'yiVYy_i \ge -V \ge Y',所以:

    $$|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} $$

    X+Y=(X2V)+(Y2V)=X+Y4VX' + Y' = (X - 2V) + (Y - 2V) = X + Y - 4V,代入得:

    $$\text{res}_1 = \min_{1 \le i \le n} (x_i + y_i) - (X + Y) + 4V $$

    Smin=min1in(xi+yi)S_{\min} = \min_{1 \le i \le n} (x_i + y_i),则:

    X+Y=Smin+4Vres1X + Y = S_{\min} + 4V - \text{res}_1

    获取 V=XYV = X - Y

    考虑执行以下四次操作:

    1. 左移 VV 单位
    2. 左移 VV 单位
    3. 上移 VV 单位
    4. 上移 VV 单位

    经过这四次操作后,机器人位置变为:

    X=X2V,Y=Y+2VX' = X - 2V, \quad Y' = Y + 2V

    此时 XVX' \le -VYVY' \ge V

    对于任意锚点 (xi,yi)(x_i, y_i),有 XVxiX' \le -V \le x_i

    实际上,我们需要保证机器人位于所有锚点的左上方,即 XxiX' \le x_iYyiY' \ge y_i 对所有 ii 成立。

    由于 xiVx_i \ge -V,而 XVX' \le -V,所以 XxiX' \le x_i 成立。
    由于 yiVy_i \le V,而 YVY' \ge V,所以 YyiY' \ge y_i 成立。

    因此,此时对于任意锚点,有 XxiX' \le x_iYyiY' \ge y_i,所以:

    $$|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$。

    Dmin=min1in(xiyi)D_{\min} = \min_{1 \le i \le n} (x_i - y_i),则:

    res2=(XY)+4V+Dmin\text{res}_2 = -(X - Y) + 4V + D_{\min}

    因此:

    XY=4V+Dminres2X - Y = 4V + D_{\min} - \text{res}_2

    另一种对称做法(与标程一致)

    标程中采用的是另一种对称的操作序列来获取 XYX - Y

    执行以下四次操作:

    1. 右移 VV 单位
    2. 右移 VV 单位
    3. 上移 VV 单位
    4. 上移 VV 单位

    经过这四次操作后,机器人位置变为:

    X=X+2V,Y=Y+2VX' = X + 2V, \quad Y' = Y + 2V

    此时 XVX' \ge VYVY' \ge V,机器人位于所有锚点的右上方

    对于任意锚点 (xi,yi)(x_i, y_i),有 XxiX' \ge x_iYyiY' \ge y_i,所以:

    $$|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} $$

    X+Y=(X+2V)+(Y+2V)=X+Y+4VX' + Y' = (X + 2V) + (Y + 2V) = X + Y + 4V,所以:

    $$\text{res}_2 = X + Y + 4V - \max_{1 \le i \le n} (x_i + y_i) $$

    这给出的是 X+YX + Y 的另一个表达式,而不是 XYX - Y。因此标程实际使用了不同的操作序列来获取 XYX - Y


    正确方案:获取 XYX - Y 的另一种方法

    执行以下四次操作:

    1. 右移 VV 单位
    2. 右移 VV 单位
    3. 下移 VV 单位
    4. 下移 VV 单位

    经过这四次操作后,机器人位置变为:

    X=X+2V,Y=Y2VX' = X + 2V, \quad Y' = Y - 2V

    此时 XVX' \ge VYVY' \le -V,机器人位于所有锚点的右下方

    对于任意锚点 (xi,yi)(x_i, y_i),有 XxiX' \ge x_iYyiY' \le 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} $$

    计算 XY=(X+2V)(Y2V)=XY+4VX' - Y' = (X + 2V) - (Y - 2V) = X - Y + 4V

    Dmax=max1in(xiyi)D_{\max} = \max_{1 \le i \le n} (x_i - y_i),则:

    res2=(XY)+4VDmax\text{res}_2 = (X - Y) + 4V - D_{\max}

    因此:

    XY=Dmax4V+res2X - Y = D_{\max} - 4V + \text{res}_2

    最终方案

    操作序列

    第一步:获取 X+YX + Y

    执行四次操作:两次左移 VV,两次下移 VV

    得到返回值 res1\text{res}_1,计算:

    $$X + Y = \min_{1 \le i \le n} (x_i + y_i) + 4V - \text{res}_1 $$

    第二步:获取 XYX - Y

    执行四次操作:两次右移 VV,两次下移 VV

    得到返回值 res2\text{res}_2,计算:

    $$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} $$

    总共使用 88 次操作,满足 10\le 10 的限制。


    代码实现

    #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+YX + Y

    机器人经过两次左移 VV 和两次下移 VV 后,位置为 (X2V,Y2V)(X - 2V, Y - 2V)。由于 X,YVX, Y \ge -V,有 X2VVX - 2V \le -VY2VVY - 2V \le -V。对所有锚点 (xi,yi)(x_i, y_i)xiVx_i \ge -VyiVy_i \ge -V,因此 X2VxiX - 2V \le x_iY2VyiY - 2V \le y_i

    曼哈顿距离:

    $$|x_i - (X - 2V)| + |y_i - (Y - 2V)| = (x_i - X + 2V) + (y_i - Y + 2V) = (x_i + y_i) - (X + Y) + 4V $$

    取最小值:

    res1=mini(xi+yi)(X+Y)+4V\text{res}_1 = \min_i (x_i + y_i) - (X + Y) + 4V $$\Rightarrow X + Y = \min_i (x_i + y_i) + 4V - \text{res}_1 $$

    推导 XYX - Y

    机器人经过两次右移 VV 和两次下移 VV 后,位置为 (X+2V,Y2V)(X + 2V, Y - 2V)。由于 X,YVX, Y \le V,有 X+2VVX + 2V \ge VY2VVY - 2V \le -V。对所有锚点 (xi,yi)(x_i, y_i)xiVx_i \le VyiVy_i \ge -V,因此 X+2VxiX + 2V \ge x_iY2VyiY - 2V \le y_i

    曼哈顿距离:

    $$|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
    上传者