东北育才 day6

大逃亡(escape)

【问题描述】

给出数字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|。

【输入格式】

第一行3个整数为N,X,Y

第二行4个整数为x1,y1,x2,y2

下面将有N行,为N个敌人所在的坐标。

【输出格式】

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

【样例输入】

2 5 6

0 0 4 0

2 1

2 3

【样例输出】

2 14

由最大化最小值,我们可以想到二分。

然后每次距离需要预处理出来,我们很容易想到bfs。

二分答案检查可行性,最后得出最优解。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
bool mark[1010][1010];
int map[1010][1010];
int heng[5000010],shu[5000010];
int bs[1010][1010];
int n,m,k,head,tail,qx,qy,zx,zy;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void bfs()
{
    int i,nx,ny,xx,yy,p;
    while(head<=tail)
    {
        xx=heng[head];
        yy=shu[head];
        head++;
        for(p=0;p<4;p++)
        {
            nx=xx+dx[p];
            ny=yy+dy[p];
            if(nx<1||nx>n||ny<1||ny>m)
            continue;
            if(!mark[nx][ny])
            {
                mark[nx][ny]=1;
                map[nx][ny]=map[xx][yy]+1;
                tail++;
                heng[tail]=nx;
                shu[tail]=ny;
            }
        }
    }
}
bool check(int mid)
{
    int i,xx,yy,nx,ny,p;
    head=1;
    tail=1;
    heng[1]=qx;
    shu[1]=qy;
    memset(mark,0,sizeof(mark));
    memset(bs,127,sizeof(bs));
    mark[qx][qy]=1;
    bs[qx][qy]=0;
    while(head<=tail)
    {
        xx=heng[head];
        yy=shu[head];
        head++;
        for(p=0;p<4;p++)
        {
            nx=xx+dx[p];
            ny=yy+dy[p];
            if(nx<1||nx>n||ny<1||ny>m||map[nx][ny]<mid)
            continue;
            if(!mark[nx][ny])
            {
                mark[nx][ny]=1;
                bs[nx][ny]=bs[xx][yy]+1;
                tail++;
                heng[tail]=nx;
                shu[tail]=ny;
            }
        }
    }
    if(mark[zx][zy])
    return 1;
    else
    return 0;
}
int main()
{
    //freopen("escape.in","r",stdin);
    //freopen("escape.out","w",stdout);
    int i,a,b,l=0,r,mid;
    scanf("%d%d%d",&k,&n,&m);
    head=1;
    tail=0;
    scanf("%d%d%d%d",&qx,&qy,&zx,&zy);
    qx++;
    qy++;
    zx++;
    zy++;
    for(i=1;i<=k;i++)
    {
        scanf("%d%d",&a,&b);
        a++;
        b++;
        tail++;
        heng[tail]=a;
        shu[tail]=b;
        mark[a][b]=1;
    }
    bfs();
    r=map[qx][qy];
    while(l+1<r)
    {
        mid=(l+r)>>1;
        if(check(mid))
        l=mid;
        else
        r=mid;
    }
    if(check(r))
    {
        cout<<r<<" "<<bs[zx][zy];
    }
    else
    {
        check(l);
        cout<<l<<" "<<bs[zx][zy];
    }
}

时间: 2024-10-04 07:36:05

东北育才 day6的相关文章

东北育才 day6 T3 大逃亡

大逃亡(escape)[问题描述]给出数字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).在移动的过程中你当然希望离敌人的距离的最小值最大化,现在请求出这个值最大可以为多少?以及在这个前提下,你最少要走多少步才可以到目标点.注意这里距离的定义为两点

东北育才10天大总结

老师们 Scanf的嗓门照例是最大的.恩. “我是山里的孩子……小的时候背书,整个山头都听得见……” 有一个哈师大附中的竞赛教练很……怎么说呢?接地气好了. Scanf说东北人很耿直,似乎确实是这样的.衡水的教练早就被遣返了…… “他啊,监考去了!” 虽然他不在,但还是不还手机.让衡水的人天天在电脑上颓废…… Scanf不在,你看我们就很老实.他到处“乱”玩,甚至跑到了国境线边,连火车票都忘了买,坐高铁去,乘绿皮火车回,路过长白山就去玩了一趟,结果暴风雪逼得他去吃“暴辣”的烤鱿鱼. “我看<三八

东北育才 第9天

感觉自己颓了一下午,感觉好坏啊.“老师”似是实力有待提高,场上多次陷入僵局.但他确实是一个很随和的人,只是大家都不听课……试求其心理阴影面积.我在想,以后如果有机会能够献课,应当以何种姿态防止大家这样?毕竟人心齐才能办大事啊. 旁边的那位同学说,把网断了就好了……好法子! 姓名 名称 性别 day1总分 day2总分 day3总分 day4总分 day6总分 day7总分 day8总分 总分 rank 王逸安 hsdfz_wya 男 210 90 130 130 105 90 130 885 1

东北育才 第8天

我今天不是特别想写了,但是说些什么吧. 今天清真食堂吃炸鸡,喝羊肉汤(虽然是夏天……),爽极了. 考试是最后一次了,又很弱……为什么我一次rank 1只能高别人10分,考炸了就让别人超了百十分?很值得深思啊. Trank 1:dsfz_zgz Trank 2:dsfz_lkh Trank 3:spyz_于倚岑(巧克力*1) Trank 4:cdqz_lmy lemonoil大大(巧克力*1) Trank 5:hszx_wq 衡水中学(巧克力*2) Trank 6:jdfz_fc  初三(巧克力*

东北育才 DAY2组合数取mod (comb)

组合数取模(comb) [问题描述] 计算C(m,n)mod 9901的值 [输入格式] 从文件comb.in中输入数据. 输入的第一行包含两个整数,m和n [输出格式] 输出到文件comb.out中. 输出一行,一个整数 [样例输入] 2 1 [样例输出] 2 [数据规模与约定] 对于 20%的数据,n<=m<=20 对于 40%的数据,n<=m<=2000 对于 100%的数据,n<=m<=20000 这道题描述很清楚,有很多种做法,第一题还是挺水的,而且很多网站上

东北育才 第4天

OIER的生活总是满足“一些好事,然后一些坏事,然后一些好事”这样的规律.所以OIER认为接下来的n天也是满足这样的规律的. 昨天崩了,这道题当时没有读懂,结果只有好事坏事好事三段,当时直接以为好事坏事好事坏事好事坏事是个无尽的循环.或许是一位挺像我的,因为又是一个rank 1. 确实不想说,坏的时候可以直接垫底,好友可以特别好,似乎从小到大一直是这样,让我特别懵. 今天晚上看了一部电影,潘菲洛夫28勇士,战争片,老毛子16年拍的,豆瓣评分7.1,据说耗资200万美元.几乎没有剧情,就是一个排的

东北育才 第5天

时间真的过得好快啊,这就是第5天.仿佛是天上方一日,地下已千年啦. 今天没有考试,心中空落落的.生态试验基地确实很有趣,麻雀虽小,五脏俱全.门口的牌匾据说是袁隆平大大提名的,特别强.里面有电脑中控,有水培,有枇杷,有香蕉,有荔枝,有苹果,有樱桃,有梨,有栀子花,有仙人掌,有火龙果,有麻雀,有狗,有羊,原来有鹿,有浣熊,有孔雀.还有小麦和水稻,同学自己耕种.更有花艺教室和生物实验室,就是一个学校旁边的百草园,回去以后可以跟生竞的人说说了. 路上全是“吊死鬼”(一种绿色毛虫),以前特别害怕,现在第一

东北育才 NOIP模拟赛第1场

终于400了.这套题很鬼畜.两道贪心. GRACE sort过后,不能直接统计,本人毫无多想,相同的直接放在一起.结果太多人AC. SUM sigma+异或和(可使用前缀和处理),本人毫无考虑乱MOD,居然对了50分.(注意处理2^63-1) 1 #define PN "sum" 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 template<class T&

东北育才 数论专场第2场

本人弃坑了! comb 简单求组合数,方法很多. maths 转化公式,发现积性,发现规律后乱搞.(居然给时6s) beetle 离散化后BFS,模拟. divisorful 这道题打打表就够了.(恶心,想吐) 居然rank 1,不想多说了.