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
/*
①灌水法 by hzwer
②二维前缀和 by me
③并查集乱搞 by 某神犇
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<map>
#include<vector>
#define ll long long
#define x1 X1
#define y1 Y1
#define x2 X2
#define y2 Y2
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int ans1,ans2;
int head,tail;
int n,X,Y;
int x1,y1,x2,y2;
int mp[][];
int x[],y[],step[];
bool vis[][];
int xx[]={,-,,},yy[]={,,,-};
void pre()
{
while(head!=tail)
{
int nx=x[head],ny=y[head];head++;
for(int k=;k<;k++)
{
int tx=nx+xx[k],ty=ny+yy[k];
if(tx>=X||ty>=Y||tx<||ty<||mp[tx][ty]!=-)continue;
mp[tx][ty]=mp[nx][ny]+;
x[tail]=tx;y[tail]=ty;tail++;
}
}
}
int bfs(int val)
{
head=;tail=;
if(x1==x2&&y1==y2)return ;
memset(vis,,sizeof(vis));
vis[x1][y1]=;x[]=x1;y[]=y1;
while(head!=tail)
{
int nx=x[head],ny=y[head],ns=step[head];head++;
for(int k=;k<;k++)
{
int tx=nx+xx[k],ty=ny+yy[k];
if(tx>=X||ty>=Y||tx<||ty<||mp[tx][ty]<val||vis[tx][ty])continue;
vis[tx][ty]=;
if(tx==x2&&ty==y2)return ns+;
x[tail]=tx;y[tail]=ty;step[tail]=ns+;tail++;
}
}
return -;
}
int main()
{
//freopen("escape.in","r",stdin);
//freopen("escape.out","w",stdout);
memset(mp,-,sizeof(mp));
n=read();X=read();Y=read();
x1=read();y1=read();x2=read();y2=read();
for(int i=;i<=n;i++)
{
int a=read(),b=read();
mp[a][b]=;
x[tail]=a;y[tail]=b;tail++;
}
pre();
int l=,r=mp[x1][y1];
while(l<=r)
{
int mid=(l+r)>>;
int t=bfs(mid);
if(t==-)r=mid-;
else l=mid+,ans1=mid,ans2=t;
}
printf("%d %d\n",ans1,ans2);
return ;
} #include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int maxn = ,inf = ;
inline int read(){
char ch=getchar();
int f=,x=;
while(!(ch>=''&&ch<='')){if(ch=='-')f=-;ch=getchar();};
while(ch>=''&&ch<=''){x=x*+(ch-'');ch=getchar();};
return x*f;
}
struct nd{
int x;
int y;
};
int p,n,m;
int ex[maxn],ey[maxn],xa,xb,ya,yb;
int flag,dis[][],vis[][];
short d[][],s[][];
int dx[] = {,,-,};
int dy[] = {,,,-};
bool emy[][];
inline bool jud(int x,int y,int t){
if(x < || y < || x >= m || y >= n) return false;
if(t == ) return true;
t--;
int tx=+x-y+t,ty=x+y+t,dx=+x-y-t,dy=x+y-t;
if(ty>=n+m-) ty = n+m-;
if(tx>=+m) tx = +m;
int tot = s[ty][tx];
if(dy>&&dx>-n) tot += s[dy-][dx-];
if(dy>) tot -= s[dy-][tx];
if(dx>-n) tot -= s[ty][dx-];
if(tot) return false;
else return true;
}
bool check(int t){
if(!jud(xa,ya,t)) return false;
flag++;
for(int i = ;i <= n+;i++){
for(int j = ;j <= m+;j++){
dis[i][j] = inf;
}
}
nd now,nxt;
now.x = xa;
now.y = ya;
queue<nd> q;
q.push(now);
dis[ya][xa] = ;
vis[ya][xa] = flag;
while(!q.empty()){
now = q.front();
q.pop();
//cout<<now.y<<" "<<now.x<<endl;
for(int dr = ;dr < ;dr++){
nxt.x = now.x + dx[dr];
nxt.y = now.y + dy[dr];
if(jud(nxt.x,nxt.y,t)&&vis[nxt.y][nxt.x] != flag){
dis[nxt.y][nxt.x] = dis[now.y][now.x] + ;
vis[nxt.y][nxt.x] = flag;
q.push(nxt);
if(nxt.y == yb && nxt.x == xb) return true;
}
}
}
return false;
}
int main(){
cin>>p>>m>>n>>xa>>ya>>xb>>yb;
for(int i = ;i <= p;i++){
scanf("%d%d",&ex[i],&ey[i]);
emy[ex[i]+ey[i]][+ex[i]-ey[i]] = true;
}
for(int i = ;i < n + m - ;i++){
for(int j = -n;j < +m;j++){
if(emy[i][j]) d[i][j] = d[i][j-] + ;
else d[i][j] = d[i][j-];
}
}
for(int i = ;i < n + m - ;i++){
for(int j = -n;j < +m;j++){
if(!i) s[i][j] = d[i][j];
else s[i][j] = s[i-][j] + d[i][j];
}
}
int l = ,r = n + m,mid,ans1,ans2;
while(l <= r){
mid = (l + r) >> ;
if(check(mid)){
ans1 = mid;
ans2 = dis[yb][xb];
l = mid + ;
}else{
r = mid - ;
}
}
cout<<ans1<<" "<<ans2;
return ;
} #include <cstdio>
#include <queue>
#include <cstring>
using namespace std; const int N=+;
const int X=+, Y=+;
const int pace[][]={{, }, {, }, {, -}, {-, }}; int n, sz_x, sz_y; struct Point {
int x, y;
inline Point(int _x=, int _y=): x(_x), y(_y) {}
inline Point walk(int k) {
return Point(x+pace[k][], y+pace[k][]);
}
}; Point S, D; int dis_enemy[X][Y]; inline void read_general() {
scanf("%d%d%d", &n, &sz_x, &sz_y);
scanf("%d%d%d%d", &S.x, &S.y, &D.x, &D.y);
} inline void read_enemy_and_process_dis() {
memset(dis_enemy, 0x3f, sizeof(dis_enemy));
queue<Point> q;
for(int i=; i<=n; ++i) {
Point E; scanf("%d%d", &E.x, &E.y);
dis_enemy[E.x][E.y]=;
q.push(E);
}
while(!q.empty()) {
Point U=q.front(); q.pop();
for(int k=; k<; ++k) {
Point V=U.walk(k);
if(V.x< || V.x>=sz_x || V.y< || V.y>=sz_y ||
dis_enemy[V.x][V.y]<0x3f3f3f00) continue;
dis_enemy[V.x][V.y]=dis_enemy[U.x][U.y]+;
q.push(V);
}
}
} int dis_s[X][Y]; inline int calc_dist(int mid) {
memset(dis_s, 0x3f, sizeof(dis_s));
queue<Point> q;
if(dis_enemy[S.x][S.y]>=mid) {
q.push(S);
dis_s[S.x][S.y]=;
}
while(!q.empty()) {
Point U=q.front(); q.pop();
for(int k=; k<; ++k) {
Point V=U.walk(k);
if(V.x< || V.x>=sz_x || V.y< || V.y>=sz_y ||
dis_enemy[V.x][V.y]<mid ||
dis_s[V.x][V.y]<0x3f3f3f00) continue;
dis_s[V.x][V.y]=dis_s[U.x][U.y]+;
q.push(V);
}
}
return dis_s[D.x][D.y];
} int main() {
read_general();
read_enemy_and_process_dis();
int l=, r=;
while(l<r-) {
int mid=(l+r)>>;
if(calc_dist(mid)<0x3f3f3f00) l=mid; else r=mid;
}
printf("%d %d\n", l, calc_dist(l));
return ;
}

LYDSY热身赛 escape的更多相关文章

  1. ACM: Gym 101047E Escape from Ayutthaya - BFS

    Gym 101047E Escape from Ayutthaya Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I6 ...

  2. 简单明了区分escape、encodeURI和encodeURIComponent

    一.前言 讲这3个方法区别的文章太多了,但是大部分写的都很绕.本文试图从实践角度去讲这3个方法. 二.escape和它们不是同一类 简单来说,escape是对字符串(string)进行编码(而另外两种 ...

  3. c#模拟js escape方法

    public static string Escape(string s) { StringBuilder sb = new StringBuilder(); byte[] ba = System.T ...

  4. 【BZOJ-1340】Escape逃跑问题 最小割

    1340: [Baltic2007]Escape逃跑问题 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 264  Solved: 121[Submit] ...

  5. javascript escape()函数和unescape()函数

    javascript escape()函数和unescape()函数 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法: escape(string) stri ...

  6. HDU 3605 Escape(状压+最大流)

    Escape Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  7. escape,encodeURI,encodeURIComponent的区别

    escape是对字符串进行编码而另外两种是对URL. encodeURI方法不会对下列字符编码 ASCII字母 数字 ~!@#$&*()=:/,;?+'encodeURIComponent方法 ...

  8. C#针对js escape解码

    在javascript 中通常用escape与unescape进行编码以方便传输. 在asp.net页面接收到这些数据以后可以使用 Microsoft.JScript.GlobalObject.une ...

  9. escape(), encodeURI()和encodeURIComponent()(转)

      escape(), encodeURI()和encodeURIComponent()是在Javascript中用于编码字符串的三个常用的方法,而他们之间的异同却困扰了很多的Javascript初学 ...

随机推荐

  1. 理解Docker(1):Docker 安装和基础用法

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  2. NYOJ---540奇怪的排序

    奇怪的排序 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 最近,Dr. Kong 新设计一个机器人Bill.这台机器人很聪明,会做许多事情.惟独对自然数的理解与人类不一 ...

  3. hdu-5977 Garden of Eden(树分治)

    题目链接: Garden of Eden Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  4. 【Python数据分析】工作日发文章比周末发文章访问量高?

    前言 看前面有位朋友分析了一下每天某个时间发文章的访问量区别,以讨论非系统性因素对文章访问量的影响.之所以进一步讨论工作日和周末发文对文章访问量的影响,一是觉得很有意思,二是毕业设计与此有很大关系,三 ...

  5. Ubuntu raid5+lvm实验

    首先说一下本次实验的环境:VMware12+Ubuntu (虚拟硬盘+mdadm) 本次实验参照http://allenyu.blog.51cto.com/193668/162067中的流程,下面总结 ...

  6. 第3章 Linux常用命令(5)_网络命令和挂载命令

    7. 网络命令 7.1 给用户发信息,以ctr+D保存结束 (1)write命令 命令名称 write 命令所在路径 /user/bin/write 执行权限 所有用户 语法 write <用户 ...

  7. 关于调整input里面的输入光标大小

    input输入框用一个背景图模拟,设置height和line-height一样的高度,使里面的输入文字能够居中, 在FF下出现的情况是:点击input时,输入光标其实上跟input的height一样高 ...

  8. WINDOW的cmd的命令【转载】

    转载地址:https://zhidao.baidu.com/question/583956458.htmlwinver---------检查windows版本 wmimgmt.msc----打开win ...

  9. cf Round 603

    A.Alternative Thinking(思维) 给出一个01串,你可以取反其中一个连续子串,问取反后的01子串的最长非连续010101串的长度是多少. 我们随便翻一个连续子串,显然翻完之后,对于 ...

  10. ASP.NET(C#) Web Api通过文件流下载文件到本地实例

    下载文件到本地是很多项目开发中需要实现的一个很简单的功能.说简单,是从具体的代码实现上来说的,.NET的文件下载方式有很多种,本示例给大家介绍的是ASP.NET Web Api方式返回HttpResp ...