题目链接:https://codeforces.com/problemset/problem/1486/B
思路:
横坐标方向和纵坐标方向的最优选择是独立的,则可以将二维问题转换为两个一维问题,最后横坐标的最优个数乘以纵坐标的最优个数就是总的方案数。
由一维的 货仓选址 问题可知,应该建在中位数处。
如果 n n n 是奇数,那么横纵方向的最优位置都只有 1 1 1 个,总的方案数就是 1 1 1 个。
如果 n n n 是偶数,那么横坐标方向的最优位置有 c n t x = x [ n / 2 ] − x [ n / 2 − 1 ] + 1 cntx = x[n / 2] - x[n / 2 - 1] + 1 cntx=x[n/2]−x[n/2−1]+1 个,纵坐标方向的最优位置有 c n t y = y [ n / 2 ] − y [ n / 2 − 1 ] + 1 cnty = y[n / 2] - y[n / 2 - 1] + 1 cnty=y[n/2]−y[n/2−1]+1 个,总的方案数就是 c n t x ∗ c n t y cntx*cnty cntx∗cnty 个。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1010;
int x[N], y[N];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d%d", &x[i], &y[i]);
}
if (n & 1)
{
printf("1\n");
continue;
}
sort(x, x + n);
sort(y, y + n);
int cntx = x[n / 2] - x[n / 2 - 1] + 1;
int cnty = y[n / 2] - y[n / 2 - 1] + 1;
printf("%lld\n", (ll)cntx * cnty);
}
return 0;
}