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. 安卓&IOS 手机添加O365 邮箱账户

    手机添加O365 邮件账户 一.Android手机添加O365邮件账户 1. 找到手机上“电子邮件” 2. 打开设置 3. 点击添加账户 4. 选择“Exchange” 5. 输入O365的邮箱账户和 ...

  2. 系统设计摘录CAP

    系统架构设计理论与原则 这里主要介绍几种常见的架构设计理论和原则,常见于大中型互联系统架构设计. (一).CAP理论 1.什么是CAP 所谓CAP,即一致性(Consistency).可用性(Avai ...

  3. Qt获取本机IP地址

    Qt获取本机IP地址: Qt版本:4.8.6 #include <QtNetwork/QNetworkInterface.h> QString ipAddr; QList<QHost ...

  4. Long time no blogging

    It is a long time before I posted the last blog on myspace and seems that all of my blogs/documents ...

  5. Python学前基础知识

    Python基础计算机常识:硬件性能:CPU.内存输入设备:鼠标.键盘外部存储设备:硬盘输出设备;显示器.打印机(不算自带)通讯设备:无线网卡----------------------------- ...

  6. 升级或者重装Discuz! 版本后 QQ互联英文乱码显示的正确解决方法

    升级Discuz! X3版本QQ互联英文乱码!connect_viewthread_share_to_qq!  目前Discuz!论坛上 最简单的解决方法: 第一步:后台----->站长---- ...

  7. 光线步进——RayMarching入门

    入门实现 先用RayMarching描绘一个球体,最后在进行光照计算参考:https://www.shadertoy.com/view/llt3R4 模拟摄像机射线float3 rayDirectio ...

  8. liunx+mysql数据库管理

    源码安装 查询是否安装:  rpm -aq |grep mysql 1.下载yum 源            wget 'https://dev.mysql.com/get/mysql57-commu ...

  9. powerDesigner 一些设置

    常用设置 table中需要显示的内容 --------------------------------------------------------------------------------- ...

  10. window Chrome 下允许跨域访问服务端接口设置

    关闭chrome,使用cmd命令进入chrome安装目录cd C:\Program Files (x86)\Google\Chrome\Application 然后使用命令打开chromechrome ...