首页 > 其他分享 >abc353f 题解

abc353f 题解

时间:2024-05-13 09:45:03浏览次数:17  
标签:sy sx abc353f tx ty 题解 ll abs

大分讨,由于没注意到细节挂大分。

下面称大小为 \(n\times n\) 的为大格子,\(1\times 1\) 的为小格子。把 \(n\times n\) 个小格子组成的正方形称为一个部分。

分析

我们先来讨论一般情况。

思考一

对于 \(n\ge3\) 的一般情况,如果要求任意两个大格子到对方的距离最小,怎么做?

根据贪心,我们不难把行走拆为两个部分:

  • 部分一
    从左上角红色格子到绿色格子部分。

  • 部分二
    从绿色格子到右下角红色格子部分。

我们发现,假设如果从任意一个点到另一个点,它的路径是这样的:

每一部分贪心的走。我们发现相邻两个大格子需要走两次,然后分析一下,不难得出距离公式:
\(D(sx,sy,tx,ty)=2\times \max(|sx-sy|,|tx-ty|)\)。

思考二

如果起点、终点在小格子里怎么办?

没有关系。我们这些情况转化为大格子的情况。

然后计算权值时再加上蓝色线条部分的长度即可。
这里最多会计算 \(4\times 4=16\) 次。

思考三

如果在起点,终点在同一部分里,怎么办?

对于在大格子,答案显然是 \(0\)。

对于小格子,似乎是两点之间的曼哈顿距离?
不对!这就是笔者挂分的点!

它还可以绕出去……具体可以看图。

所以要归并到上面的情况一起计算。

思考四

似乎做完了?
不,还有特殊情况。

  • \(n=1\)

输出曼哈顿距离即可。

  • \(n=2\)

这个改变的地方在这里:

从绿色格子到终点的部分,我们选择直接穿过所有格子。

因为绕两次需要穿过四次格子,直接穿过却只需要三次。
特判一下即可。

至此,这道题就完工了。

Code

#include<bits/stdc++.h>
#define N 600005
#define ll long long
using namespace std;
struct node{
	ll x,y;
};
ll n;
ll sx,sy,tx,ty;
ll d(ll sx,ll sy,ll tx,ll ty)
{
	ll P=max(abs(sx-tx),abs(sy-ty));
	if(n^2) return P*2;
	else return min(abs(sx-tx),abs(sy-ty))*2+(abs(abs(sx-tx)-abs(sy-ty)))/2*3;
}
node B(ll x,ll y)
{
	node tmp;
	tmp.x=x/n;
	tmp.y=y/n;
	return tmp;
}
node S[5],T[5];
ll ds[5],dt[5];
ll sn=1,tn=1;
ll ans=4e18;
ll w[5];
int main()
{
	scanf("%lld",&n);
	scanf("%lld%lld%lld%lld",&sx,&sy,&tx,&ty);
	if(n==1)
	{
		printf("%lld",abs(sx-tx)+abs(sy-ty));
		return 0;
	}
	S[0]=B(sx,sy),T[0]=B(tx,ty);
	if(S[0].x==T[0].x&&S[0].y==T[0].y)
	{
		if((S[0].x&1)==(S[0].y&1)) ans=abs(sx-tx)+abs(sy-ty);
		else
		{
			printf("0");
			return 0;
		}
	}
	if((S[0].x&1)==(S[0].y&1))
	{
		sn=4;
		S[1]=(node){S[0].x-1,S[0].y};ds[1]=abs(S[0].x*n-sx)+1;
		S[2]=(node){S[0].x,S[0].y-1};ds[2]=abs(S[0].y*n-sy)+1;
		S[3]=(node){S[0].x+1,S[0].y};ds[3]=abs(S[0].x*n+n-sx);
		S[4]=(node){S[0].x,S[0].y+1};ds[4]=abs(S[0].y*n+n-sy);
	}
	else S[1]=S[0];
	if((T[0].x&1)==(T[0].y&1))
	{
		tn=4;
		T[1]=(node){T[0].x-1,T[0].y};dt[1]=abs(T[0].x*n-tx)+1;
		T[2]=(node){T[0].x,T[0].y-1};dt[2]=abs(T[0].y*n-ty)+1;
		T[3]=(node){T[0].x+1,T[0].y};dt[3]=abs(T[0].x*n+n-tx);
		T[4]=(node){T[0].x,T[0].y+1};dt[4]=abs(T[0].y*n+n-ty);
	}
	else T[1]=T[0];
	for(int i=1;i<=sn;i++)
	{
		for(int j=1;j<=tn;j++)
		{
			ll dis=d(S[i].x,S[i].y,T[j].x,T[j].y);
			ans=min(ans,dis+ds[i]+dt[j]);
		}
	}
	printf("%lld",ans);
	return 0;
}

标签:sy,sx,abc353f,tx,ty,题解,ll,abs
From: https://www.cnblogs.com/g1ove/p/18188634

相关文章

  • cfRounddiv3--CDEF题解
    C-AssemblyviaRemainders思路:因为xi最大只有500,而构造的ai最大可以到1e9,直接从501开始构造即可。voidsolve(){//C简单构造intn;cin>>n;vector<int>vct;vct.emplace_back(501);for(inti=2;i<=n;i++){intx;cin>>x;vc......
  • Atcoder ABC 353 全题解
    最近看的人好少……都快不想写了……你们的支持就是我创作的最大动力!AB%你CDE题意:有一个一个一个函数,把函数两两配对式求值,求这些值最后的总和C考虑将所有的和减去$10^8$出现的次数。将整个数组排序,然后进行二分,求第一个与这个数的和$\ge10^8$的位置,然后与这个数......
  • abc_353_b题解
    这道题怎么说呢……开始看题目翻译也是一脸懵,然后直接就看了样例解释,然后:瞬间明白!所以:样例解释YYDS!样例解释YYDS!!样例解释YYDS!!!停停停不开玩笑了。仍旧是分步解决问题(诶不是怎么突然联想到了加法原理):输入(每道题几乎都有的东西~~~),不用多说,按照题目要求解决。循环。这一步......
  • abc_353_a题解
    题目传送门~~~CSDN传送门~~~这题纯纯一个数组遍历。如果你看不懂英文的话,那么atcoderbetter这个插件可以帮助你,所有洛谷&atcoder&codeforces的插件都在这里:https://www.luogu.com/article/p2ri0gub咳咳……跑题了跑题了!下面就是题解:输入。这一步很简单,定义变量n和数组H......
  • P10229 [COCI 2023/2024 #4] Knjige 题解
    P10229[COCI2023/2024#4]Knjige题解知识点前缀和、贪心、枚举。题意分析一个长度为\(n\)的单调不减的数列\(\{k_i\}\),从左到右遍历,用\(a\)或\(b\)的代价,换\(0\)或\(k_i\)的价值。问:在总代价超过\(t\)之前,能够达到的最大价值为多少?思路分析显然是一个......
  • P10224 [COCI 2023/2024 #3] Vrsar 题解
    P10224[COCI2023/2024#3]Vrsar题解知识点前缀和思想,贪心。题意分析我觉得题目挺清晰了……思路部分分没必要,OK?我不会告诉你我考场上打部分分打了30min,还只有8分。正解我们设一个方案\(S\)为\(\{x_1,x_2...x_n\}\),其中\(x_i\)表示第\(i\)个滑雪场的......
  • P10225 [COCI 2023/2024 #3] Milano C.le 题解
    P10225[COCI2023/2024#3]MilanoC.le题解知识点栈,贪心,树状数组。题意分析求最小的栈的数量使得出入栈能够合法。思路分析我们为了方便,其实可以先按照到达车站的顺序(入栈顺序)给火车重新编号。编号后,就十分简单了。分析样例:53524132514编号后,就变成了:5......
  • P10232 [COCI 2023/2024 #4] Roboti 题解
    P10232[COCI2023/2024#4]Roboti题解知识点简单环,DFS。题意分析在\(n\)行,\(m\)列的网格里,给定\(k\)个转弯点,再给定\(Q\)个询问,问每次从某个坐标到另一个坐标的最少转弯次数,或者判断不可能到达。思路分析我们发现在一个点坐标与方向确定的时候,到达的下一个点的......
  • P10231 [COCI 2023/2024 #4] Putovanje 题解
    P10231[COCI2023/2024#4]Putovanje题解知识点多源BFS,bitset。题意分析在一个图上,每个点有一个权值,求满足到每个点的距离都为其权值的点(权值为\(-1\)的点除外)。思路分析Subtask1我们可以发现,这个子任务的图一定是一个有序的链,那么转换成序列问题,直接根据坐标进......
  • CF1967D Long Way to be Non-decreasing 题解
    CF1967DLongWaytobeNon-decreasing题解知识点二分答案,基环树。题意分析给定一个包含\(n\)个元素的数组\(\{a_i\}\)和一个\(m\)个元素的数组\(\{b_i\}\)。定义每次操作为:在\(\{a_i\}\)中选择任意个数,假设某个选的数为\(a_i\),那么将其变为\(b_{a_i}\)......