B. For the Champion
B. For the Champion
题目点击下方链接查看
注意到可查询的范围 \(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\),可以得到:
同理,我们继续走到左上角,执行 \((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\) 的值。
点击查看代码
#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;
}
浙公网安备 33010602011771号