首页 > 其他分享 >[ABC353F] Tile Distance 题解

[ABC353F] Tile Distance 题解

时间:2024-05-18 19:08:27浏览次数:29  
标签:Distance dsx dsy 题解 back long push mp Tile

[ABC353F] Tile Distance 题解

题目传送门:洛谷, Atcoder

Solution

很恶心人的分类讨论题。

很显然走大格子大概率比走小格子快。

对终点和起点向上下左右枚举大格子,我们就把问题转化为给两个大格子 \((a,b)\)、\((c,d)\),求怎样走最快。

对角的大格子可以通过 \(2\) 步相互到达,如下图所示。

于是我们可以以以下路径,这是一般情况的最短路径,步数为 \(max(|a-c|,|b-d|)\)。(据说这是切比雪夫距离)

然而当 \(k \leq 2\),最后一段路不需要上下横跳,直接横穿小格子即可,步数为 \(\frac{k+1}{2}min(|a-c|,|b-d|)+||a-c|-|b-d||\)。

最后要讨论只通过小格子达到的情况,就让上面算出的答案和曼哈顿距离去最小值就好了。

注意:若起点和终点在同一个小格子的块中,答案不一定是他们的曼哈顿距离,就像下图所示的情况,显然红线比绿线短。

code

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<queue>
#include<cstring>
#include<cmath>
#include<cassert>
#define pr pair < long long, pair<long long, long long> >
#define mp make_pair
using namespace std;
long long k, sx, sy, tx, ty;
long long gt(long long ax, long long ay, long long bx, long long by){
	long long a = abs(ax - bx), b = abs(ay - by), ans = max(a, b) * 2, sp = max(a, b) - min(a, b);
	if(k == 1)
		return a + b;
	if(k == 2)
		return a + b + sp / 2;
	return ans;
}
vector < pr > a, b;
int main(){
	cin >> k >> sx >> sy >> tx >> ty;
	long long dsx = sx / k, dsy = sy / k, dtx = tx / k, dty = ty / k;
	long long dis = max(sx, tx) - min(sx, tx) + max(sy, ty) - min(sy, ty);
	if((dsx + dsy) % 2 == 0){
		a.push_back(mp(sx - dsx * k + 1, mp(dsx - 1, dsy)));
		a.push_back(mp(sy - dsy * k + 1, mp(dsx, dsy - 1)));
		a.push_back(mp((dsx + 1) * k - sx, mp(dsx + 1, dsy)));
		a.push_back(mp((dsy + 1) * k - sy, mp(dsx, dsy + 1)));
	}
	else
		a.push_back(mp(0, mp(dsx, dsy)));
	if((dtx + dty) % 2 == 0){
		b.push_back(mp(tx - dtx * k + 1, mp(dtx - 1, dty)));
		b.push_back(mp(ty - dty * k + 1, mp(dtx, dty - 1)));
		b.push_back(mp((dtx + 1) * k - tx, mp(dtx + 1, dty)));
		b.push_back(mp((dty + 1) * k - ty, mp(dtx, dty + 1)));
	}
	else
		b.push_back(mp(0, mp(dtx, dty)));
	long long minn = dis;
	for(auto i : a)
		for(auto j : b)
			minn = min(minn, i.first + j.first + gt(i.second.first, i.second.second, j.second.first, j.second.second));
	cout << minn << endl;
	return 0;
}

标签:Distance,dsx,dsy,题解,back,long,push,mp,Tile
From: https://www.cnblogs.com/louisliang/p/18199656

相关文章

  • CF527E Data Center Drama 题解
    @目录题目题意题解思路详解注意事项代码AC记录尾声题目CF527EDataCenterDrama·戳这里题意给定一张$n$个点$m$条边的连通无向图。你需要加尽可能少的边,然后给所有边定向,使得每一个点的出入度都是偶数。边可以是自环,也可以有重边。$n\le10^5$,$m\le2\times1......
  • Codeforces 769B News About Credit 题解
    题目简述波利卡普在由$n$名学生(包括他自己)组成的小组中学习,编号为$1$到$n$,波利卡普的编号始终是$1$。他们都在社交网络上注册,每个学生都有一个值$a_i$,表示第$i$名学生每天能发送的最大信息数。清晨,波利卡普知道了一个重要消息,他认为有必要通过私人消息紧急通知所有组员......
  • 安装vue/cli报错问题解决
    在管理员终端中输入命令:npmi-g@vue/cli错误原因证书已过期,需要安装淘宝镜像npmconfigsetregistryhttps://registry.npmmirror.com使用cnpm安装脚手架报错cnpmi-g@vue/cli 这个错误表明你尝试执行的 cnpm 命令无法加载,因为PowerShell策略不允许执......
  • P10125 「Daily OI Round 3」Simple 题解
    题目传送门简单模拟,主要考察字符串。首先输入一个char类型的数组,然后直接遍历每一位是否为Acoipp或Svpoll即可。//Simple//codeby:cq_irritater//time:2024/02/04#include<bits/stdc++.h>usingnamespacestd;chara[10];intmain(){//freopen("......
  • P8684 [蓝桥杯 2019 省 B] 灵能传输 题解
    题目传送门本题涉及到了\(3\)种算法:前缀和,排序以及贪心。(1)前缀和本题实际上要求通过某种灵能传输可以使得该序列的最大值最小。而由前缀和可知,当某一个前缀和序列保持有序(或前缀和序列表示的函数单调)时,其\(s[i]-s[i-1]\)的最大值可以达到最小。通过对几个样例的观察......
  • P9686 Judg. 题解
    题目传送门一道简单模拟。这道题最简单的方法就是直接在for循环中判断题目给出状态是否为AC,如果不是则输出当前\(i\)的值,否则就不输出。#include<bits/stdc++.h>usingnamespacestd;constintMAXN=1e5+10;intn;stringa[MAXN];intmain(){ scanf("%......
  • P8741 [蓝桥杯 2021 省 B] 填空问题 题解
    题目传送门试题A:空间【解析】本题考察计算机存储的基础知识,只要掌握空间存储的换算方法,就能够算出答案。【程序】#include<bits/stdc++.h>usingnamespacestd;intmain(){printf("%d\n",256*8/32*1024*1024);return0;}【答案】67108864......
  • P8679 [蓝桥杯 2019 省 B] 填空问题 题解
    题目传送门试题A:组队【解析】本题是一道经典的DFS搜索题,每次对各号位的选手进行DFS,找到各号位上有成绩的选手时再进行进一步搜索即可。【程序】#include<bits/stdc++.h>usingnamespacestd;intteam[20][6];intmax_sum;boolvis[20];voiddfs(intu,intsu......
  • P9517 drink 题解
    题目传送门这道题考场上用的查找做的。先用一个结构体分别表示firstlast,然后进行查找即可,两个for循环分别计算出first和last,最后计算它们的差值。(注意,计算差值时要加1)然后你就会发现一个问题:只有\(90\)分。所以我们来思考一下哪里出现了问题。你会发现:如果全都是......
  • Codeforces 959B Mahmoud and Ehab and the message 题解
    题目简述小A想要给他的朋友小B发送了一条有$m$个单词的消息。他们的语言由编号从$a_1$到$a_n$的$n$个单词组成。一些单词具有相同的意思,因此存在$k$个单词组,其中每个组中的所有单词具有相同的意思。小A知道第$i$个单词可以以成本$m_i$发送。对于他的每个消息......