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

题解:AT_abc353_f [ABC353F] Tile Distance

时间:2025-01-13 11:21:12浏览次数:1  
标签:Distance dsx dsy 题解 back long push mp Tile

[ABC353F] Tile Distance 题解

cnblogs

题目传送门:洛谷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/18668254

相关文章

  • ABC388DEG 题解
    ABC388题解ABCDE+G,rk371。D观察到几个性质:一个人只会在成年的时候得到石头,在成年之后给出石头。第\(i\)个人成年之后,他要给之后的每个人一个石头(除非用光了)。也就是说,假设成年时它的石头数量为\(B_i\),则最终他的石头数量为\(\max(0,B_i-(n-i))\)。因此我们只需......
  • LeetCode 2275: 按位与结果大于零的最长组合题解
    LeetCode2275:按位与结果大于零的最长组合题解1.题目分析这道题目考察了位运算的基本概念和应用。我们需要在给定的数组中找出最长的子序列,使得这些数字进行按位与运算后的结果大于0。1.1关键概念按位与运算(&)两个二进制位都为1时,结果为1。只要有一个为0,结果就为0......
  • 【大数据】beeline 导出文件有特殊字符的问题解决
    问题近期在做大数据查询引擎导出文件的功能,使用了hive的beeline客户端。发现beeline导出的文件以及终端输出有许多特殊字符。按照官方文档使用beeline导出命令:[1]/usr/bin/beeline--silent=true--showHeader=true--outputformat=csv2-fquery.hql</dev/null>/tm......
  • Hetao P3804 Cut 题解 [ 蓝 ] [ AC 自动机 ] [ 差分 ]
    Cut:AC自动机简单题。思路看见多个模式串以及求前缀,很显然能想到构建一个AC自动机。那么在用\(T\)查询时,当前指针的深度就是该位置的最长前缀匹配长度。这个在字典树insert的时候就能求出来。求出每一位的最长前缀后,因为这些部分都不能作为分割点,所以将这些区域用差分......
  • 验证出栈顺序是否正确题解&队列
    (1)验证出栈顺序是否正确队列遵循先入后出的原则,故需要一个数组来模拟记录入栈和出栈再分别对出栈顺序进行遍历验证是否正确#include<iostream>usingnamespacestd;#definem100000intb[m],a[m],c[m];intmain(){ intt; cin>>t; while(t--){ intn;......
  • THUWC 2020 Day3 题解
    Cache一致性协议按照学习手册最后的模拟。\(\text{Exclusive}/\text{Shared}\)只有编号最小的返回,但都要改变状态。\(\text{Modified}\)的所有的都要返回且改变状态。Cache替换算法这里说一下\(\text{PLRU}\)算法。对于每次,先找是否命中。如果是否,就在二叉搜索树上......
  • 2021 年 3 月青少年软编等考 C 语言五级真题解析
    目录T1.红与黑思路分析T2.密室逃脱思路分析T3.求逆序对数思路分析T4.最小新整数思路分析T1.红与黑有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计......
  • Codeforces Round 734 (Div. 3) 题解
    建议开题顺序:A,B1,B2,C,E,F,D1,D2。A.PolycarpandCoins记\(k=\min(c1,c2)\),则\((c1-k)\times1+(c2-k)\times2+k\times3=n\)。注意到\(n\mod3\)为\(0,1,2\)。所以我们\(|c1-c2|\)最多为\(1\),只需要将\(n\mod3\)给\(1\)或\(2\)即可。B1.WonderfulColo......
  • P5025 [SNOI2017] 炸弹 题解
    题意link.题解我们充分发扬人类智慧。考虑到可能连锁爆炸,我们不能通过一个单纯的二分来解决问题。考虑\(dp\)。记\(f(i)\)为第\(i\)个点爆炸,最远能引爆到哪个坐标小于它的点。\(g(i)\)为第\(i\)个点爆炸,最远能引爆到哪个坐标大于它的点。我们以\(f\)为例,\(g\)......
  • AT_abc388_f Dangerous Sugoroku 题解
    太幽默了。显然可以用矩阵快速幂解决,矩阵里维护距离当前点\(B\)以内的所有点可不可达,转移只需分段,在区间内和不在区间内用不同的转移矩阵即可。复杂度\(O(B^3m\logn)\)。然后你就T了。此时你很急,你现在应该快点卡常来AK这场比赛而不是研究其他的做法,于是我们发现快速幂......