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的主要内容,如果未能解决你的问题,请参考以下文章

cf 模拟

CF1435 游记

无法解析符号 c882c94be45fff9d16a1cf845fc16ec5

本人想学习破解技术但是看不懂反汇编代码!求助!!

微信小程序代码片段

VSCode自定义代码片段——CSS选择器