首页 > 其他分享 >[ABC258F] Main Street 题解

[ABC258F] Main Street 题解

时间:2024-03-17 20:55:39浏览次数:16  
标签:sy sx min 题解 gy gx ABC258F res Main

题意:

你要在平面直角坐标系中行走,每一步可以上下左右四个方向任意移动 $1$,耗时 $k$ 秒。特别地,存在若干条快速通道,若该步起点和终点均满足 $x \equiv 0 \pmod{B}$ 或 $y \equiv 0 \pmod{B}$,则认为该步是在快速通道上进行,仅需耗时 $1$ 秒。询问从 $(S_x, S_y)$ 到 $(G_x, G_y)$ 最少需要多少秒。存在多组数据。

思路:

看这个题第一眼没什么思路,先尝试画个图。

不难发现可以分类讨论。
首先有两种基本情况:

  • 走通道
  • 不走通道

对于走通道这种情况,我们可以分别枚举起点和终点向上、下、左、右的哪一个方向走到达快速通道的距离最短,然后将过起点或终点作垂直于距离最短的快速通道的垂线段的垂足的平面距离与两条垂线段的长度乘以 $k$ 的值相加,即可得到走通道的最短时间。再将这个时间与不走通道的最短时间取个最小值即可。

对于不走通道这种情况,我们可以直接计算,注意特判一下起点和终点都在同一行或同一列的快速通道上的情况即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,b,k,sx,sy,gx,gy;
int dis(int x_1,int y_1,int x_2,int y_2){
    if(x_1%b==0&&x_2%b==0&&y_1/b==y_2/b) return min(abs(x_1-x_2)+min(y_1%b+y_2%b,b*2-y_1%b-y_2%b),abs(y_1-y_2)+abs(x_1-x_2)*k);
    swap(x_1,y_1),swap(x_2,y_2);
    if(x_1%b==0&&x_2%b==0&&y_1/b==y_2/b) return min(abs(x_1-x_2)+min(y_1%b+y_2%b,b*2-y_1%b-y_2%b),abs(y_1-y_2)+abs(x_1-x_2)*k);
    return abs(x_1-x_2)+abs(y_1-y_2);
}
signed main(){
    scanf("%lld",&T);
    while(T--){
        scanf("%lld%lld%lld%lld%lld%lld",&b,&k,&sx,&sy,&gx,&gy);
        if(sx==gx&&sy==gy) printf("0\n");
        else{
            int res=dis(sx,sy,gx,gy)*k;
            int sup=(sy/b+1)*b,sdo=sy/b*b;
            int sri=(sx/b+1)*b,sle=sx/b*b;
            int gup=(gy/b+1)*b,gdo=gy/b*b;
            int gri=(gx/b+1)*b,gle=gx/b*b;
            res=min(res,dis(sx,sup,gx,gup)+(sup-sy)*k+(gup-gy)*k);//起点向上终点向上
            res=min(res,dis(sx,sup,gx,gdo)+(sup-sy)*k+(gy-gdo)*k);//起点向上终点向下
            res=min(res,dis(sx,sup,gle,gy)+(sup-sy)*k+(gx-gle)*k);//起点向上终点向左
            res=min(res,dis(sx,sup,gri,gy)+(sup-sy)*k+(gri-gx)*k);//起点向上终点向右
            res=min(res,dis(sx,sdo,gx,gup)+(sy-sdo)*k+(gup-gy)*k);//起点向下终点向上
            res=min(res,dis(sx,sdo,gx,gdo)+(sy-sdo)*k+(gy-gdo)*k);//起点向下终点向下
            res=min(res,dis(sx,sdo,gle,gy)+(sy-sdo)*k+(gx-gle)*k);//起点向下终点向左
            res=min(res,dis(sx,sdo,gri,gy)+(sy-sdo)*k+(gri-gx)*k);//起点向下终点向右
            res=min(res,dis(sle,sy,gx,gup)+(sx-sle)*k+(gup-gy)*k);//起点向左终点向上
            res=min(res,dis(sle,sy,gx,gdo)+(sx-sle)*k+(gy-gdo)*k);//起点向左终点向下
            res=min(res,dis(sle,sy,gle,gy)+(sx-sle)*k+(gx-gle)*k);//起点向左终点向左
            res=min(res,dis(sle,sy,gri,gy)+(sx-sle)*k+(gri-gx)*k);//起点向左终点向右
            res=min(res,dis(sri,sy,gx,gup)+(sri-sx)*k+(gup-gy)*k);//起点向右终点向上
            res=min(res,dis(sri,sy,gx,gdo)+(sri-sx)*k+(gy-gdo)*k);//起点向右终点向下
            res=min(res,dis(sri,sy,gle,gy)+(sri-sx)*k+(gx-gle)*k);//起点向右终点向左
            res=min(res,dis(sri,sy,gri,gy)+(sri-sx)*k+(gri-gx)*k);//起点向右终点向右
            printf("%lld\n",res);
        }
    }
    return 0;
}

标签:sy,sx,min,题解,gy,gx,ABC258F,res,Main
From: https://www.cnblogs.com/PerchLootie/p/18079144

相关文章

  • JAVA面向对象高级:static修饰成员方法 真正搞懂main方法 类方法实例方法应用场景
         真正搞懂main方法    类方法实例方法应用场景类方法最常见的应用场景是做工具类      ......
  • P3939 数颜色 题解
    题目链接:数颜色经典题目了,暴力数据结构随便过,不过这种不带修的单个颜色的数量查找有个经典的做法:分桶+二分。具体的为每个颜色分桶,记录有序下标,这样就可以二分出\([l,r]\)上的下标个数。对于一次交换来说,如果相邻的颜色相同那么并不会发生交换,如果不同那么就发生交换,由于下标在......
  • P10218 [省选联考 2024] 魔法手杖 题解
    Description给定\(a_1,a_2,\dots,a_n\)以及\(b_1,b_2,\dots,b_n\),满足\(a_i\in[0,2^k-1]\)以及\(b_i\geq0\),你需要给出\(S\subseteq\{1,2,\dots,n\}\)以及\(x\in[0,2^k-1]\)满足以下条件:\(\sum\limits_{i\inS}b_i\leqm\);满足以上条件的前提下,最大化\......
  • P2746 [USACO5.3] 校园网Network of Schools 题解
    题目链接:校园网NetworkofSchools这个题得翻译下题目意思才知道在干嘛,题目一开始表明了这个是一个有向图,因为边是单向的。其次关于第一个问题:基于一个事实,如果有\(x\rightarrowy\rightarrowz\),那么只需要\(x\)接受协议,它所在的\(scc\)强连通分量上的点一定都能不需要......
  • AT_abc345_c [ABC345C] One Time Swap 题解
    题目传送门解法对于\(S_{i}\),设\(num_{S_{i}}\)表示\(S_{i+1\simn}\)中\(S_{i}\)出现的次数,则\(S_{i}\)对答案产生的贡献为\(n-i-num_{S_{i}}\)。注意原串在存在两个相同的元素的时候,也要统计在内。代码#include<bits/stdc++.h>usingnamespacestd;#definell......
  • P2163 [SHOI2007] 园丁的烦恼 题解
    题目链接:园丁的烦恼挺经典的题目,转化成二维数点去做这玩意和常规的偏序计数问题有区别:转化为求\(a\lex\leb\\&\&\c\ley\led\)的数量,这种就别想着拆来拆去了,这种权值类带偏序计数类问题,是经典的可差性问题,我们计:\(ans(x,l,r)\)表示\(t\lex,l\ley\ler\)的数......
  • P3302 [SDOI2013] 森林 题解
    题目链接:森林有意思的树上可持久化线段树变形题,建议先看这个:P2633Countonatree题解对于本题而言,我们重新阐述树上可持久化线段树的核心思想,对于点路径/边路径上的第\(k\)大问题,我们使用树上前缀和问题的思想,将其转化为可差性问题:一条路径上的权值线段树可以拆分为几棵权......
  • 贪心算法题解
    前言大家好,我是jiantaoyab,这篇文章将给大家介绍贪心算法和贪心算法题目的练习和解析,贪心算法的本质就是每一个阶段都是局部最优,从而实现全局最优。我们在做题的同时,不仅要把题目做出来,还要有严格的证明。柠檬水找零在柠檬水摊上,每一杯柠檬水的售价为5美元。顾客排队......
  • codeforce Round 934 div2 个人题解(A~C)
    A.DestroyingBridges时间限制:1秒内存限制:256兆输入:标准输入输出:标准输出有$n$个岛屿,编号为$1,2,…,n$。最初,每对岛屿都由一座桥连接。因此,一共有$\frac{n(n-1)}{2}$座桥。Everule住在岛屿$1$上,喜欢利用桥梁访问其他岛屿。Dominater有能力摧毁最多$k$座......
  • AtCoder-abc345_f题解
    题意简述给定一个无向图。你要在其中选出一些边,使得选出的边所构成的图中,度数为奇数的点有\(K\)个。如果可以,输出选了哪些边,否则输出-1。思路首先在选一条边时,边两端点度数的奇偶性一定都会改变,即要么都变为奇数,要么两个点的奇偶性交换过来,要么都变为偶数。这三种情况时满足......