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. AJPFX总结java开发常用类(包装,数字处理集合等)(一)

    一:首谈java中的包装类 Java为基本类型提供包装类,这使得任何接受对象的操作也可以用来操作基本类型,直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类.jav ...

  2. AJPFX浅谈Java新手问题之缺少良好的编程习惯

    ★随意地命名 有些新手写程序,当需要定义某个变量名(也可能是函数名.类名.包名等)时,随意地一敲键盘,名字就起好了......若干星期后,碰到某 bug,再来看自己写的代码时,心中暗自嘀咕:“这代码是 ...

  3. 【经验总结】VS2010下建立MFC程序

    孙鑫的MFC教学视频非常不错,但是由于视频中孙鑫老师采用VC6.0版本,而现在 许多人都转向了使用VS,VS为我们生成了许多不需要的代码,这也导致在这节课的学习编程中总是遇到一些困难.那么,如何去掉这 ...

  4. java写跳一跳辅助程序

    ##起初是想使用按键精灵脚本程序控制,但还是选择熟悉的java.我这里使用了工具,造成延迟问题.也求教:java控制安卓的正确姿势, 参考了.NET玩跳一跳,思路都是一样的,只不过使用ADB控制安卓的 ...

  5. IP查询系统的异步回调案例

    package com.lxj.demo; import java.io.BufferedReader; import java.io.IOException; import java.io.Inpu ...

  6. Visual studio每次build自动增加版本号

    关键词:visual studio,rc file,VS_VERSION_INFO,FILEVERSION,PRODUCTVERSION 目标:希望每次在vs中编译项目时,生成的可执行程序版本号自动+ ...

  7. 正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果集 java.lang.OutOfMemoryError: Java heap space

    昨天在项目中需要对日志的查询结果进行导出功能. 日志导出功能的实现是这样的,输入查询条件,然后对查询结果进行导出.由于日志数据量比较大.多的时候,有上亿条记录. 之前的解决方案都是多次查询,然后使用l ...

  8. Android掌中游斗地主游戏源码完整版

    源码大放送-掌中游斗地主(完整版),集合了单机斗地主.网络斗地主.癞子斗地主等,有史以来最有参考价值的源码,虽然运行慢了一点但是功能正常,用的是纯java写的. 项目详细说明:http://andro ...

  9. 一个PHP开发APP接口的视频教程

    感觉php做接口方面的教程很少,无意中搜到了这个视频教程,希望能给一些人带来帮助http://www.imooc.com/learn/163

  10. SAP云平台架构概述

    在我们开始SAP云平台的架构之旅之前,让我们先看看SAP已经发布的一些其他云产品.这些云产品方案可以分为公有云和私有云两种. SAP公有云解决方案见下图最右侧,比较著名的有SAP SuccessFac ...