Description

给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上

矩形的行号从0到X-1,列号从0到Y-1再给出四个数字x1,y1,x2,y2,代表你要从点(x1,y1)移到(x2,y2)。

在移动的过程中你当然希望离敌人的距离的最小值最大化,现在请求出这个值最大可以为多少,以及在这个前提下

你最少要走多少步才可以回到目标点。注意这里距离的定义为两点的曼哈顿距离,即某两个点的坐标分为(a,b),(c,d)

那么它们的距离为|a-c|+|b-d|。

Input

第一行给出数字N,X,Y

第二行给出x1,y1,x2,y2

下面将有N行,给出N个敌人所在的坐标

Output

在一行内输出你离敌人的距离及在这个距离的限制下,你回到目标点最少要移动多少步。

Sample Input

2 5 6
0 0 4 0
2 1
2 3

Sample Output

2 14

这周考试的第三题...

看起来很水但是做起来会发现没有思路

肯定要先构造一个原图(这个不用说)

我想的是用best[i][j]来表示点(i,j)距离最近的敌人的距离。

但是我发现我只会用\(O(n*x*y)\)的时间复杂度预处理!!!

这个思路很简单,best数组初始值极大值,每次输入一对坐标就遍历一遍这个图,把best[i][j]和敌人与点(i,j)的距离取min,然后就可以得到一张预处理过的图。

很明显,这玩意会炸:\(N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000)\)。

\(O(n*x*y)\)原地爆炸好吗!!!

经过机房大佬细心开导 ,预处理用一个BFS来完成。

思路:输入坐标打入队列,然后和正常的BFS一样向周围扩散求得best值,因为BFS先遇到的肯定最优,所以这个方法只需要大概\(O(x*y)\)的时间复杂度就能完成预处理。

然后就是搜索过程emmm

搜索需要用二分来完成!!!!

这道题类似的,把最终值拿来二分,下界0,上界是终点和起点的best值取min!因为起点和终点是一定会经过的,不妨用这个特性来缩小二分范围,然后用mid传入bfs搜索一波就行...具体二分过程不多讲解,不懂的可以看一下代码:

#include<bits/stdc++.h>
#define FAST_IN std::ios::sync_with_stdio(false);cin.tie(NULL);
using namespace std;
int x,y,n,sx,sy,ex,ey,step;
inline int hl/*howlong*/(int a,int b,int c,int d)
{
return abs(a-c)+abs(b-d);
}
struct node
{
int x,y,t;
};
int best[1010][1010];
bool vis[1010][1010];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
queue<node> s;
void bfs1()
{
while(!s.empty())
{
node now=s.front();
s.pop();
for(int i=0;i<4;i++)
{
int tx=now.x+dir[i][0];
int ty=now.y+dir[i][1];
if(tx>=0&&ty>=0&&tx<x&&ty<y&&!best[tx][ty])
{
best[tx][ty]=now.t+1;
s.push((node){tx,ty,now.t+1});
}
}
}
}
bool bfs(int left)
{
if(best[sx][sy]-1<left)return 0;
memset(vis,0,sizeof(vis));
queue<node> q;
q.push((node){sx,sy,0});
vis[sx][sy]=1;
while(!q.empty())
{
node now=q.front();
q.pop();
if(now.x==ex&&now.y==ey)
{
step=now.t;
return 1;
}
for(int i=0;i<4;i++)
{
int tx=now.x+dir[i][0],ty=now.y+dir[i][1];
if(best[tx][ty]-1<left)continue;
if(!vis[tx][ty]&&best[tx][ty]-1>=left&&0<=tx&&tx<x&&0<=ty&&ty<y)
{
q.push((node){tx,ty,now.t+1});
vis[tx][ty]=1;
}
}
}
return 0;
}
int main()
{
FAST_IN;
scanf("%d%d%d%d%d%d%d",&n,&x,&y,&sx,&sy,&ex,&ey);
for(int i=1;i<=n;i++)
{
int tx,ty;
scanf("%d%d",&tx,&ty);
best[tx][ty]=1;
s.push((node){tx,ty,1});
}
bfs1();
// for(int i=0;i<x;i++)
// {
// for(int j=0;j<y;j++)
// {
// cout<<best[i][j];
// }
// cout<<endl;
// }
int l=0,r=best[ex][ey];
while(l<r)
{
int mid=(l+r)/2;
if(bfs(mid))l=mid+1;
else r=mid;
}
cout<<r-1<<" "<<step<<endl;
return 0;
}

ov.

【题解】[Nwerc 2006]escape -C++的更多相关文章

  1. 集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096)

    集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096) 题目描述 有一个专门为了集合运算而设计的"集合栈"计算机.该 ...

  2. LA 3635 Pie 派 NWERC 2006

    有 f + 1 个人来分 n 个圆形派,每个人得到的必须是一整块派,而不是几块拼在一起,并且面积要相同.求每个人最多能得到多大面积的派(不必是圆形). 这题很好做,使用二分法就OK. 首先在读取所有派 ...

  3. 打印队列 (Printer Queue,ACM/ICPC NWERC 2006,UVA12100)

    题目描述: 题目思路: 使用一个队列记录数字,一个优先队列记录优先级,如果相等即可打印: #include <iostream> #include <queue> using ...

  4. 集合栈计算机 (The SetStack Computer,ACM/ICPC NWERC 2006,UVa12096

    题目描述: #include<iostream> #include<string> #include<set> #include<map> #inclu ...

  5. Uva 派 (Pie,NWERC 2006,LA 3635)

    依然是一道二分查找 #include<iostream> #include<cstdio> #include<cmath> using namespace std; ...

  6. Java实现派(Pie, NWERC 2006, LA 3635)

    题目 有F+1个人来分N个圆形派,每个人得到的必须是一整块派,而不是几块拼在一起,且面积要相同.求每个人最多能得到多大面积的派(不必是圆形). 输入的第一行为数据组数T.每组数据的第一行为两个整数N和 ...

  7. 【二分答案】【POJ3122】【Northwestern Europe 2006】Pie

    Pie Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10629   Accepted: 3744   Special Ju ...

  8. OI 刷题记录——每周更新

    每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...

  9. uva 12096 - The SetStack Computer(集合栈)

    例题5-5 集合栈计算机(The Set Stack Computer,ACM/ICPC NWERC 2006,UVa12096) 有一个专门为了集合运算而设计的"集合栈"计算机. ...

随机推荐

  1. Docker系列5--一些问题及解决

    1. 存储问题 1.1 挂载目录权限问题 在使用swarm创建服务的时候要挂载存储来获取运行文件,及写日志出去. 可运行文件相当于在集群中所有地方应该都能访问到,所以使用了NFS文件系统,在集群中所有 ...

  2. KNN算法识别手写数字

    需求: 利用一个手写数字“先验数据”集,使用knn算法来实现对手写数字的自动识别: 先验数据(训练数据)集: ♦数据维度比较大,样本数比较多. ♦ 数据集包括数字0-9的手写体. ♦每个数字大约有20 ...

  3. .net Core如何对静态文件的访问进行鉴权操作?

    之前给公司开发了一个文件管理服务,最基本的功能就是文件的上传下载,以及更新删除.预览:负责公司各个子系统的相关附件的管理,所有的接口都通过AOP来进行身份拦截认证了,但是在进行预览的时候,因为采用的是 ...

  4. kong命令(四)upstream

    介绍 upstream 就是一个虚拟的服务.可用于配置多个target目标服务时实现负载均衡的效果. 注意:service的host指的就是upstream的name. 同时upstream提供了一个 ...

  5. Python笔记-备忘

    一.向列表添加元素 x.append(y) #末尾添加一个元素 x.extend([y,z]) #末尾添加多个元素 x.insert(index,y) 二.向列表获取元素 x[index] 三.从列表 ...

  6. 关于MQ的几件小事(六)消息积压在消息队列里怎么办

    1.大量消息在mq里积压了几个小时了还没解决 场景:几千万条数据在MQ里积压了七八个小时,从下午4点多,积压到了晚上很晚,10点多,11点多.线上故障了,这个时候要不然就是修复consumer的问题, ...

  7. java 传入用户名和密码并自动提交表单实现登录到其他系统

    不用单点登录,模拟远程项目的登录页面表单,在访问这个页面的时候自动提交表单到此项目的登录action,就可以实现登录到其他系统. ssh框架项目 1.以下是本地系统的action代码: import ...

  8. wamp新建虚拟目录无法运行的解决方法

    操作步骤: 打开 D:\wamp\bin\apache\apache2.4.9\conf\httpd.conf  文件,大概在第242行 把 <Directory /> AllowOver ...

  9. 针对IE6 7 8当独写样式

    IE8的格式: .foot{padding:12px 10px\9;} //在后面加\9 IE7的格式: .foot{*padding:12px 10px\9;} //在前面加* IE6的格式: .f ...

  10. .tar.gz文件和.tar.xz文件的解压和压缩

    1,.tar文件 tar  -cvf 压缩 tar  -xvf 解压 例如: tar -xvf mysql-8.0.16-linux-glibc2.12-x86_64.tar 2,.xz文件 xz  ...