BZOJ1696: [Usaco2007 Feb]Building A New Barn新牛舍
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新牛舍的更多相关文章
- 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 ...
- 【BZOJ】1696: [Usaco2007 Feb]Building A New Barn新牛舍(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1696 原题要求min(sum{|x-xi|+|y-yi|}),且一定要看题:“没有两头牛的吃草位置是 ...
- bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 ——中位数排序
Description 经过多年的积蓄,农夫JOHN决定造一个新的牛舍.他知道所有N(2 <= N <= 10,000)头牛的吃草位置,所以他想把牛舍造在最方便的地方. 每一头牛吃草的位置 ...
- BZOJ 1696 [Usaco2007 Feb]Building A New Barn新牛舍 数学
题意:链接 方法:数学+模拟 解析: 首先这类问题不是第一次见了,所以直接知道拿x的中位数.y的中位数. 这题就是讨论情况很的烦. 题中有个限制,给出待求和的点不能选取. 所以假设奇数个点,求出x中位 ...
- [USACO07FEB]新牛棚Building A New Barn
洛谷题目链接:[USACO07FEB]新牛棚Building A New Barn 题目描述 After scrimping and saving for years, Farmer John has ...
- BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路( MST )
计算距离时平方爆了int结果就WA了一次...... ------------------------------------------------------------------------- ...
- bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路 -- 最小生成树
1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec Memory Limit: 64 MB Description Farmer J ...
- BZOJ1631: [Usaco2007 Feb]Cow Party
1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 459 Solved: 338[Submit ...
- BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序
1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 387 Solved: 215[S ...
随机推荐
- 安卓&IOS 手机添加O365 邮箱账户
手机添加O365 邮件账户 一.Android手机添加O365邮件账户 1. 找到手机上“电子邮件” 2. 打开设置 3. 点击添加账户 4. 选择“Exchange” 5. 输入O365的邮箱账户和 ...
- 系统设计摘录CAP
系统架构设计理论与原则 这里主要介绍几种常见的架构设计理论和原则,常见于大中型互联系统架构设计. (一).CAP理论 1.什么是CAP 所谓CAP,即一致性(Consistency).可用性(Avai ...
- Qt获取本机IP地址
Qt获取本机IP地址: Qt版本:4.8.6 #include <QtNetwork/QNetworkInterface.h> QString ipAddr; QList<QHost ...
- 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 ...
- Python学前基础知识
Python基础计算机常识:硬件性能:CPU.内存输入设备:鼠标.键盘外部存储设备:硬盘输出设备;显示器.打印机(不算自带)通讯设备:无线网卡----------------------------- ...
- 升级或者重装Discuz! 版本后 QQ互联英文乱码显示的正确解决方法
升级Discuz! X3版本QQ互联英文乱码!connect_viewthread_share_to_qq! 目前Discuz!论坛上 最简单的解决方法: 第一步:后台----->站长---- ...
- 光线步进——RayMarching入门
入门实现 先用RayMarching描绘一个球体,最后在进行光照计算参考:https://www.shadertoy.com/view/llt3R4 模拟摄像机射线float3 rayDirectio ...
- liunx+mysql数据库管理
源码安装 查询是否安装: rpm -aq |grep mysql 1.下载yum 源 wget 'https://dev.mysql.com/get/mysql57-commu ...
- powerDesigner 一些设置
常用设置 table中需要显示的内容 --------------------------------------------------------------------------------- ...
- window Chrome 下允许跨域访问服务端接口设置
关闭chrome,使用cmd命令进入chrome安装目录cd C:\Program Files (x86)\Google\Chrome\Application 然后使用命令打开chromechrome ...