CF1468B
Posted WHY2020
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1468B相关的知识,希望对你有一定的参考价值。
题意:
给你 \\(n\\) 个坐标 \\(p_i\\) (\\(i\\leq n\\)),求满足到 \\(p_i\\) 的曼哈顿距离之和最小的整点个数 。
思路:
初中课本教过我们这个题目的弱化版:求到数轴上到 \\(n\\) 个点距离之和最小的点的个数,当 \\(n\\) 为奇数时只能取 \\(n\\) 个数的中位数 ,偶数时可以取 \\(p_\\frac{n}{2}\\) 到 \\(p_{\\frac{n}{2}+1}\\) 之间的所有点 ,整点则共有 \\(p_{\\frac{n}{2}+1}-p_\\frac{n}{2}+1\\) 个 (此时假设 \\(n\\) 个点顺序排列)。
不妨把 \\(x_{p_i}\\) 与 \\(y_{p_i}\\) 分开在两个数轴上考虑,那么所选的点一定是满足到 \\(x_{p_i}\\) 距离之和最小的点且到 \\(y_{p_i}\\) 距离之和最小的点,显然这样的点在 \\(n\\) 为奇数时只有 \\(1\\) 个 ,\\(n\\) 为偶数时有 \\((x_{p_{\\frac{n}{2}+1}}-x_{p_\\frac{n}{2}}+1) \\times (y_{p_{\\frac{n}{2}+1}}-y_{p_\\frac{n}{2}}+1)\\) ,排序一下再统计即可。
代码:
#include<bits/stdc++.h>
#define ll long long //No long long see your ancestor!!!
#define ull unsigned long long //Have long long see your ancestor!!!
#define ld long double //No long double see your ancestor!!!
using namespace std;
struct node
{
int x,y;
}p[1005];
bool cmp1(node a,node b)
{
return a.x<b.x;
}
bool cmp2(node a,node b)
{
return a.y<b.y;
}
int main()
{
int t;cin>>t;
while(t--)
{
memset(p,0,sizeof(p));
int n;cin>>n;
for(int i=1;i<=n;i++)
{
cin>>p[i].x>>p[i].y;
}
ll ans=1;
if(n%2==0)
{
sort(p+1,p+1+n,cmp1);
ans*=p[n/2+1].x-p[n/2].x+1;
// cout<<p[n/2+1].x-p[n/2].x+1<<"\\n";
sort(p+1,p+1+n,cmp2);
ans*=p[n/2+1].y-p[n/2].y+1;
// cout<<p[n/2+1].y-p[n/2].y+1<<"\\n";
}
cout<<ans<<"\\n";
}
// system("pause");
}
以上是关于CF1468B的主要内容,如果未能解决你的问题,请参考以下文章