cf 1486B Eastern Exhibition

传送门:https://codeforces.com/contest/1486/problem/B
 
根据题意可知,已知条件就是在一个二维平面上,你(和你朋友)拥有的所有房子的坐标,
目的让你选出一个或若干个坐标作为场地,该坐标距离所有房子的距离之和最小。
有一个规律,即当n(房子的个数)为奇数时,最佳场地的个数ans必定为1:
{
  n==1时,显然ans=1;
  n==3时,任意两个房子之间的最佳场地可能有一个或若干个,这时候把第三个房子算上,若干个点中只有一个距离它最近的点,即是最佳场地;
  n>=5时,以此类推…
}
现在只剩n为偶数的情况,我们要取的是距离所有房子最近的坐标,也就是这个坐标在所有房子的中间,当然这个中间不一定是一个准确的点,所以为了找中间,我们先找到偏向于中间的房子,再具体点就是找中间的横纵坐标。为此,我们将所有房子的横纵坐标分别装在两个vector里,进行sort排序,接着找到两组中位数,共四个数分别为x1、x2、y1、y2,之后在坐标上作出这四条线,它们围出来的空间所包含的点数,即是ans的值,共有三种情况(“十”形、“十十”形、“井”形)。
 

最后附上AC代码:
 

#include<bits/stdc++.h> 
using namespace std;
int main()
{
    int t;
    cin>>t;
     while(t--)
     {
        int n;
        cin>>n;
        vector<long long>x;
        vector<long long>y;
        for(int i=0;i<n;i++)
        {
            long long nx,ny;
            cin>>nx>>ny;
            x.push_back(nx);
            y.push_back(ny);
        }
        if(n%2==1)
        {
            cout<<1<<endl;
        }
        else
        {
            long long x1,x2,y1,y2;
            sort(x.begin(),x.end());
            sort(y.begin(),y.end());
            x1=x[(n/2)-1];
            x2=x[(n/2)];
            y1=y[(n/2)-1];
            y2=y[(n/2)];
            long long ans=(x2-x1+1)*(y2-y1+1);
            cout<<ans<<endl;
        }
    }
    return 0;
 }

 

posted @ 2021-02-22 14:02  Re_chit  阅读(96)  评论(0)    收藏  举报