CF1332A Exercising Walk 题解

16 篇文章 1 订阅
5 篇文章 0 订阅
博客讲述了如何解决CF1332A问题,重点在于理解题意,通过抵消上、下步数和左、右步数来确定最优终点,并判断是否在给定范围内。特殊情况如行或列没有活动空间的情况也进行了说明。解决方案的时间复杂度为O(T)。
摘要由CSDN通过智能技术生成

博客园同步

原题链接

简要题意:

多组数据,每次起点为 x , y x,y x,y,需要上走 a a a 步,下走 b b b 步,左走 c c c 步,右走 d d d 步,问每次的坐标 x , y x,y x,y 是否均能满足 x 1 ≤ x ≤ x 2 x1 \leq x \leq x2 x1xx2 y 1 ≤ y ≤ y 2 y1 \leq y \leq y2 y1yy2.

因为没有规定走的顺序,所以我们采用这样的策略:

尽量让 a , b a,b a,b 抵消, c , d c,d c,d 抵消。

即,起点为 x , y x,y x,y ,则 最优的终点 应当是 x − a + b , y − c + d x-a+b,y-c+d xa+b,yc+d.

只要判断这个是否在范围内即可。

但是,良心的出题人在样例给我们一个特殊边界。

如果 x = x 1 = x 2 x = x1 = x2 x=x1=x2 a ≠ 0 a \not = 0 a=0 b ≠ 0 b \not = 0 b=0,你在行上没有活动空间,肯定走不成。

列同理。

时间复杂度: O ( T ) O(T) O(T).

实际得分: 100 p t s 100pts 100pts.

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;

inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
	int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}

int main(){
	int T=read(),a,b,c,d,x,y,x1,y1,x2,y2;
	while(T--) {
		a=read(),b=read(),c=read(),d=read();
		x=read(),y=read(),x1=read(),y1=read(),x2=read(),y2=read();
		if(a && b && x==x1 && x==x2 || c && d && y==y1 && y==y2) puts("NO"); //先判边界
		else {
			x+=b-a; y+=d-c;
			if(x1<=x && x<=x2 && y1<=y && y<=y2) puts("YES");
			else puts("NO"); //一般情况
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值