题目链接:题目
大意:
给出平面上一些点,要在到每个点曼哈顿距离之和最小的地方开展会,问有多少个这样的地方。
思路:
经典的仓库问题是一维的,答案就是中位数或者两个中位数之间的所有数,而这一个问题可以拆分为两个一维的仓库问题,分别找出x轴和y轴的点数,然后相乘。
为什么这样做能够成立呢?因为所算的曼哈顿距离本身就是两个轴上距离的线性叠加,并且展会位置的选择是完全任意的,不受x,y的限制,因而可以同时在x,y上取到最小值。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MOD 1000000007
#define fi first
#define se second
#define pii pair<int,int>
#define vec vector
void solve(){
int n;
cin >> n;
vec<int> x(n), y(n);
for(int i = 0;i < n;i++) cin >> x[i] >> y[i];
if(n % 2 != 0){
cout << 1 << '\n';
return;
}
sort(x.begin(), x.end());
sort(y.begin(), y.end());
cout << (x[n / 2] - x[n / 2 - 1] + 1) * (y[n / 2] - y[n / 2 - 1] + 1) << '\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=1;
cin >> t;
while(t--){
solve();
}
return 0;
}