CF1332A Exercising Walk 题解

CSDN同步

原题链接

简要题意:

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

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

尽量让 \(a,b\) 抵消,\(c,d\) 抵消。

即,起点为 \(x,y\) ,则 最优的终点 应当是 \(x-a+b,y-c+d\).

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

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

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

列同理。

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

实际得分:\(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;
}

posted @ 2020-04-03 10:38  bifanwen  阅读(174)  评论(0编辑  收藏  举报