n<=10000个点(xi,yi),找到一个不同于给出的所有点的点,使得该点到所有点的曼哈顿距离最小并找出这样的点的个数。

第一眼看上去这不是中位数嘛,奇数一个点偶数一片,然后找一下这篇区域有几个不符合的点即可。不过要找出“不同于给出的点”的点,那万一中位数那个点被占了,就找它四周四个点即可。

错误!明知道会有中位数那一个点被占了,那怎么就不考虑四周都被占了的情况?

不过可以肯定的是,离中位数越近的点算出来的距离是越小的,尽管与中位数点距离相同的点答案可能不同。因此判断下中位数区域是否大于n,如果是那直接记答案(因为该区域肯定有答案),否则bfs。

为什么判重要用map呢其实用set就好了。。。。

 #include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<map>
//#include<iostream>
using namespace std; int n;
#define maxn 40011
int x[maxn],y[maxn],sx[maxn],sy[maxn];
struct Point
{
int x,y;
bool operator < (const Point &b) const
{return x<b.x || (x==b.x && y<b.y);}
}p[maxn];
map <Point,bool> mp,vis;
int ans,cnt;
struct qnode{int d,x,y;}q[maxn];int head,tail;
const int dx[]={,,,,-},dy[]={,,-,,},inf=0x3f3f3f3f;
int dis(int xx,int yy)
{
int L=,R=n+;
while (L<R)
{
const int mid=(L+R+)>>;
if (x[mid]<xx) L=mid;
else R=mid-;
}
int idx=L;
L=;R=n+;
while (L<R)
{
const int mid=(L+R+)>>;
if (y[mid]<yy) L=mid;
else R=mid-;
}
int idy=L;
return (*idx-n)*xx-*sx[idx]+sx[n]+(*idy-n)*yy-*sy[idy]+sy[n];
}
bool bfs(int d)
{
bool flag=;
while (head!=tail && q[head].d==d)
{
const int nx=q[head].x,ny=q[head++].y;
if (head==maxn) head=;
if (!mp.count((Point){nx,ny}))
{
flag=;int tmp=dis(nx,ny);
if (ans>tmp)
{
ans=tmp;
cnt=;
}
else if (ans==tmp) cnt++;
}
else
{
for (int i=;i<=;i++)
{
const int px=nx+dx[i],py=ny+dy[i];
if (vis.count((Point){px,py})) continue;
vis[(Point){px,py}]=;
qnode &now=q[tail];
now.x=px;now.y=py;now.d=d+;tail++;
}
}
}
return flag;
}
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
p[i].x=x[i];p[i].y=y[i];
mp[(Point){x[i],y[i]}]=;
}
sort(x+,x++n);sort(y+,y++n);
sx[]=;for (int i=;i<=n;i++) sx[i]=sx[i-]+x[i];
sy[]=;for (int i=;i<=n;i++) sy[i]=sy[i-]+y[i];
int x1=x[(n+)/],x2=x[n/+],y1=y[(n+)/],y2=y[n/+];
if (1ll*(x2-x1+)*(y2-y1+)>n)
{
ans=sx[n]-*sx[(n+)/]+sy[n]-*sy[(n+)/];cnt=1ll*(x2-x1+)*(y2-y1+);
for (int i=;i<=n;i++)
if (p[i].x>=x1 && p[i].x<=x2 && p[i].y>=y1 && p[i].y<=y2) cnt--;
printf("%d %d\n",ans,cnt);
}
else
{
head=tail=;ans=inf;
for (int i=x1;i<=x2;i++)
for (int j=y1;j<=y2;j++)
{
qnode &now=q[tail];
now.x=i;now.y=j;now.d=;tail++;
vis[(Point){i,j}]=;
}
x[]=y[]=-inf;x[n+]=y[n+]=inf;
int play=;
while (!bfs(play++));
printf("%d %d\n",ans,cnt);
}
return ;
}

BZOJ1696: [Usaco2007 Feb]Building A New Barn新牛舍的更多相关文章

  1. Bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 中位数,数学

    1696: [Usaco2007 Feb]Building A New Barn新牛舍 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 394  Solve ...

  2. 【BZOJ】1696: [Usaco2007 Feb]Building A New Barn新牛舍(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1696 原题要求min(sum{|x-xi|+|y-yi|}),且一定要看题:“没有两头牛的吃草位置是 ...

  3. bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 ——中位数排序

    Description 经过多年的积蓄,农夫JOHN决定造一个新的牛舍.他知道所有N(2 <= N <= 10,000)头牛的吃草位置,所以他想把牛舍造在最方便的地方. 每一头牛吃草的位置 ...

  4. BZOJ 1696 [Usaco2007 Feb]Building A New Barn新牛舍 数学

    题意:链接 方法:数学+模拟 解析: 首先这类问题不是第一次见了,所以直接知道拿x的中位数.y的中位数. 这题就是讨论情况很的烦. 题中有个限制,给出待求和的点不能选取. 所以假设奇数个点,求出x中位 ...

  5. [USACO07FEB]新牛棚Building A New Barn

    洛谷题目链接:[USACO07FEB]新牛棚Building A New Barn 题目描述 After scrimping and saving for years, Farmer John has ...

  6. BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路( MST )

    计算距离时平方爆了int结果就WA了一次...... ------------------------------------------------------------------------- ...

  7. bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路 -- 最小生成树

    1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer J ...

  8. BZOJ1631: [Usaco2007 Feb]Cow Party

    1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 459  Solved: 338[Submit ...

  9. BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序

    1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 387  Solved: 215[S ...

随机推荐

  1. 各 Android 平台版本支持的 API 级别

    平台版本 API 级别 VERSION_CODE 备注 Android 7.0 24 N 平台亮点 Android 6.0 23 M 平台亮点 Android 5.1 22 LOLLIPOP_MR1 ...

  2. leetcode315 Count of Smaller Numbers After Self

    思路: bit + 离散化. 实现: #include <bits/stdc++.h> using namespace std; class Solution { public: int ...

  3. 801硬件检测工具DragonHD的使用

    801硬件检测工具DragonHD的使用 2018/11/28 13:39 版本:V1.0 开发板:SC3817R 1.客户要认证器件,使用了全志官方的工具:DragonHD.exe 打开之后可以见用 ...

  4. TigerGraph REST++API

    简介 - 什么是REST ++? TigerGraph TM 系统使用着名的REpresentational State Transfer(REST)架构来管理与TigerGraph核心组件,图形处理 ...

  5. IOS数组

    /*******************************************************************************************NSArray ...

  6. Linux环境下手动配置sbt

    一.下载sbt安装包 从sbt官网下载地址:http://www.scala-sbt.org/download.html下载安装包,以sbt-0.13.13.tgz为例. 二.安装 1.将下载的二进制 ...

  7. vue路由高级语法糖

    1.当 <router-link> 对应的路由匹配成功,将自动设置 class 属性值 .router-link-active. 模板中可以用{{$route.params.xxx取到路由 ...

  8. SQL (一)定义变量以及变量赋值

    1.定义变量:declare @name varchar(20)  用declare定义一个名字为name的字符串类型的变量,变量前面需要加@ 2.为变量赋值:set @name = '%奥迪%' , ...

  9. os x 中出现message sent to deallocated instance 的错误总结

    一般是程序中的某一个对象被release 了两次 一般情况下是与你定义的类型有关 这里面我的错误是吧 NSString 类型的变量的属性 设置为了 assign 了 目测与这个有关 补充object- ...

  10. 三大框架所使用的UI框架