• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

yumiym765

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

B. For the Champion

B. For the Champion

题目点击下方链接查看

Problem - 2135B - Codeforces

​ 注意到可查询的范围 \(k\) 为(\(0 \le k \le 10^9\)),并且式子 \(\min\limits_{1\le i \le n}(|x_i - c| + |y_i - d|)\) 的绝对值不好处理,我们考虑将机器人移动到边界再处理答案。

​ 设机器人位置为 \((X,Y)\),设定 \(V=10^9\),有 \(-V \le X, Y \le V\)。我们先移动到左下角,执行 \((L,V),(L,V),(D,V),(D,V)\),最后到达 \((X_1,Y_1)\),有 \(X_1,Y_1 \le -10^9\),记录答案 \(q_1\),有 \(q_1 = \min\limits_{1\le i \le n}(|x_i - X_1| + |y_i - Y_1|) = \min\limits_{1\le i \le n}(x_i - X_1 + y_i - Y_1)\),得到 \(\min\limits_{1\le i \le n}(x_i + y_i) - (X_1 + Y_1)\),因为 \(X_1 = X - 2V,Y_1 = Y - 2V\),可以得到:

\[X + Y = \min\limits_{1\le i \le n}(x_i + y_i) + 4V - q_1 \]

​ 同理,我们继续走到左上角,执行 \((U,V),(U,V),(U,V),(U,V)\),最后到达 \((X_2,Y_2)\),有 \(X_2 \le -10^9\),\(Y_2 \ge 10^9\),记录答案 \(q_2\),有 \(q_2 = \min\limits_{1\le i \le n}(|x_i - X_2| + |y_i - Y_2|) = \min\limits_{1\le i \le n}(x_i - X_2 - y_i + Y_2)\),得到 \(\min\limits_{1\le i \le n}(x_i - y_i) - (X_2 - Y_2)\),因为 \(X_2 = X - 2V,Y_2 = Y + 2V\),可以得到:

\[X - Y = \min\limits_{1\le i \le n}(x_i - y_i) + 4V - q_2 \]

最终可以得到 \(X,Y\) 的值。

\[X = \dfrac{1}{2}(\min\limits_{1\le i \le n}(x_i + y_i) + \min\limits_{1\le i \le n}(x_i - y_i) + 8V - (q_1 + q_2)) \]

\[Y = \dfrac{1}{2}(\min\limits_{1\le i \le n}(x_i + y_i) - \min\limits_{1\le i \le n}(x_i - y_i)- q_1 + q_2) \]

点击查看代码
#include <bits/stdc++.h>
using namespace std;
using ull = unsigned long long;
using ll = long long;

ll query(char c, ll k){
    cout << "? " << c << " " << k << endl;
    ll ans;
    cin >> ans;
    return ans;
}
void solve(){
    int n;
    cin >> n;
    vector<ll> x(n), y(n);
    ll V = 1e9;
    ll m1 = LLONG_MAX, m2 = LLONG_MAX;
    for(int i = 0;i < n;i++){
        cin >> x[i] >> y[i];
        m1 = min(m1, x[i] + y[i]);
        m2 = min(m2, x[i] - y[i]);
    }
    query('L', V);
    query('L', V);
    query('D', V);
    ll q1 = query('D', V);
    query('U', V);
    query('U', V);
    query('U', V);
    ll q2 = query('U', V);
    cout << "! " << (m1 + m2 + 8 * V - (q1 + q2)) / 2LL << " " << (m1 - m2 - q1 + q2) / 2LL << endl;
}

int main(){
    //ios::sync_with_stdio(false);
    //cin.tie(nullptr), cout.tie(nullptr);
    int T = 1;
    cin >> T;
    while(T--){
        solve();
    }
    return 0;
}

posted on 2025-09-17 12:36  羊毛corn  阅读(15)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3