首页 > 其他分享 >题解:AT_abc359_c [ABC359C] Tile Distance 2

题解:AT_abc359_c [ABC359C] Tile Distance 2

时间:2024-07-17 16:59:19浏览次数:11  
标签:Distance sy ch abs int 题解 sx ex Tile

背景

去中考了,比赛没打,来补一下题。

分析

这道题让我想起了这道题(连题目名称都是连着的),不过显然要简单一些。

这道题显然要推一些式子。我们发现,和上面提到的那道题目一样,沿着对角线走台阶,纵坐标走到以后再走横坐标显然是最优策略。这时候的答案就是横纵坐标差的和的一半(这就不用证明了)。有一个细节就是当起点和终点在它所处的砖块中位置不同时,式子不成立,这时候应该改变一下,我这里把它们都变到了它所处砖块的左边,这样是不影响答案的。放一下代码:

   int x=abs(ex-sx),y=abs(ey-sy);
	if(x%2==0&&y%2==1||x%2==1&&y%2==0)
	{
		if((sx+sy)%2==1)sx--;
		else ex--;
	}

但是当起点和终点横坐标差值小于纵坐标差值时,因为按照这个策略要往回走,所以显然要换方法。

多推几个样例可以发现,这种情况的答案就是纵坐标的差。我们来分析一下。(用了样例解释的图)

容易看出,这其实就是上面策略加上几个垂直上升的走法。这时候横坐标可以理解为是在纵坐标转移的时候顺带转移的,所以方法显然正确。

然后就做完了。

Code

#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#include<atcoder/modint>
#define int long long
#define mod 998244353
using namespace std;
using namespace  __gnu_pbds;
inline int read()
{
	int w=1,s=0;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
	return w*s;
}
const int maxn=1e6+10;
int sx,sy,ex,ey;
signed main()
{
//  freopen("xxx.in","r",stdin);
//	freopen("xxx.out","w",stdout);
	cin>>sx>>sy>>ex>>ey;
	int x=abs(ex-sx),y=abs(ey-sy);
	if(x%2==0&&y%2==1||x%2==1&&y%2==0)
	{
		if((sx+sy)%2==1)sx--;
		else ex--;
	}
	x=abs(ex-sx),y=abs(ey-sy);
	if(x<=y)cout<<y;
	else cout<<(x+y)/2;
	return 0;
}

标签:Distance,sy,ch,abs,int,题解,sx,ex,Tile
From: https://www.cnblogs.com/fengyixuan2027/p/18307814

相关文章

  • 题解:AT_abc357_f [ABC357F] Two Sequence Queries
    题意维护一个数据结构,支持两个数列的区间求和,和查询区间内两数列各元素积的和。分析线段树万岁!这道题要维护两个序列,所以线段树中要同时存储两个区间和。但还要在维护一个信息,是该区间内两序列元素积的和。大概长这样:structno{ intl,r; intda,db,ab; intta,tb;}t[m......
  • ABC357-C题解
    最近一直掉分,谔谔。分析发现机房里面除了我以外都用递归写的,那我就来讲一种非递归的吧。考虑第\(i\)级地毯拆成九块以后其实就是八块第\(i-1\)级地毯与一块大小为\(3^{i-1}\times3^{i-1}\)大小的白色地毯。所以用一个三维数组记录每一级地毯的状态,然后循环往上跑,每一级......
  • 题解:P10417 [蓝桥杯 2023 国 A] 第 K 小的和
    分析这道题不是板子么。先对序列排序,然后二分答案,设当前答案为\(x\),枚举\(a\)中的数,然后二分查找\(b\)中不大于\(x-a\)的元素个数,累加判断是否不大于\(k\)。然后稍微调一调端点就过了。Code#include<bits/stdc++.h>#include<ext/pb_ds/assoc_container.hpp>#incl......
  • 题解:AT_abc359_e [ABC359E] Water Tank
    背景中考结束了,但是暑假只有一天,这就是我现在能在机房里面写题解的原因……分析这道题就是个单调栈。题目上问你第一滴水流到每个位置的时间。我们考虑,答案其实就是比当前木板高且距离当前木板最近的那一个位置的答案加上当前木板的高度与那一个位置的距离构成的矩形面积再减......
  • 题解:P10672 【MX-S1-T1】壁垒
    暑期集训=依托答辩。分析种类数是奇数一定无解。否则每种数字先输出一次,在此过程中每增加两个数时,因为每个数字种类数都不一样,所以前缀种类数也同时增加\(2\),保证一定为偶数。然后输出完以后,设总种类数为\(m\),无论以后再怎么加入新数字,前缀种类数一定为\(m\)不变,后面数字......
  • 题解:AT_arc173_b [ARC173B] Make Many Triangles
    背景前几天打了比赛,崩麻了,所以来水一篇题解。LC真睿智题意给你\(n\)个点,问最多能组成几个三角形。分析听说可以随机化。这道题就是一个简单贪心。我们考虑,如果没有共线的点,那么答案显然就是\(\frac{n}{3}\)了。如果有共线,我们容易想到一个贪心思路:既然同一直线上的点不......
  • Divide Interval 题解
    背景太逊了,调了三次才调出来,所以写篇题解寄念。LC好睿智题意给你两个数\(a,b\),现在要从\(a\)跑到\(b\),每次可以将当前的\(a\)拆分成\(2^n\timesm(n,m\inN)\)的形式,并将它变成\(2^n\times(m+1)\)。问最少变几次能跑到\(b\),输出次数和每次变化前后\(a\)的值。分......
  • 题解:AT_abc352_d [ABC352D] Permutation Subsequence
    虽然比赛没打,但是想来水估值发表思路。题意给你一个\(1\simn\)的排列,让你从中找一段长为\(k\)的子序列,使得这个子序列中的元素排序后数值连续。分析题意转换一下,先用结构体存储每个元素的编号和数值,按照数值排序。于是这道题就成了:一个序列,让你求所有长\(k\)的子段中......
  • 有较复杂限制条件的dp(CF366C,POJ1837,CF294B题解+总结)
    前言这篇文章将用三道精选的好题例题让你学会这种类型的题目。题型看起来是一个背包,但是多了一个条件,是一个等式或不等式,有时候式子还挺复杂的,该怎么办呢?例题1CF366CDimaandSalad题意原题有n......
  • 洛谷P1596 [USACO10OCT] Lake Counting S 题解
    看别的神犇用的都是并查集,我还是用暴搜吧(doge下面纯暴搜#include<bits/stdc++.h>usingnamespacestd;intn,m,ans;//N行M列和答案charc[105][105];//存储农田的二维向量voiddfs(intx,inty){//暴搜 if(c[x][y+1]=='W'){ c[x][y+1]='.';//将水坑改为......