在 x O y xOy xOy 坐标系中有 N N N 个人,第 i i i 个人的位置是 ( X i , Y i ) (X_i,Y_i) (Xi,Yi),并且每个人的位置都不同。
我们有一个由 L
和 R
组成的长为 N N N 的字符串 S S S, S i = S_i= Si= R
代表第 i i i 个人面向右, S i = S_i= Si= L
代表第 i i i 个人面向左。
现在所有人开始朝着他们各自面向的方向走,即面向右 x x x 就增,面向左 x x x 就减。
例如,当 ( X 1 , Y 1 ) = ( 2 , 3 ) (X_1,Y_1)=(2,3) (X1,Y1)=(2,3), ( X 2 , Y 2 ) = ( 1 , 1 ) (X_2,Y_2)=(1,1) (X2,Y2)=(1,1), ( X 3 , Y 3 ) = ( 4 , 1 ) (X_3,Y_3)=(4,1) (X3,Y3)=(4,1), S = S= S= RRL
时,人们的移动如图。
我们把两个人对向行走到一个位置称为一次碰撞。请问如果人们可以无限走下去,会有人产生碰撞吗?
第一行一个整数 N N N;
接下来 N N N 行,每行两个整数 X i X_i Xi 和 Y i Y_i Yi,表示第 i i i 个人的位置;
最后一行是一个由 L
和 R
组成的长为 N N N 的字符串 S S S。
如果会有碰撞,输出 Yes
,否则输出 No
。
3
2 3
1 1
4 1
RRL
Yes
2
1 1
2 1
RR
No
10
1 3
1 4
0 0
0 2
0 4
3 1
2 4
4 2
4 4
3 3
RLRRRLRLRR
Yes
所有数据保证 2 ≤ N ≤ 2 × 1 0 5 2≤N≤2×10^5 2≤N≤2×105, 0 ≤ X i ≤ 1 0 9 0≤X_i≤10^9 0≤Xi≤109, 0 ≤ Y i ≤ 1 0 9 0≤Y_i≤10^9 0≤Yi≤109。
根据题意,我们很容易就能得出碰撞条件:
(1)同一行中,即 y y y相同
(2)行走方向相反
(3)向右走的人在左边,向左走的人在右边
那么我们的思路形成了:
遍历每一行,找出每一行中的 m i n { x ∣ x 为向右走的人的横坐标 } min\{x|x为向右走的人的横坐标\} min{x∣x为向右走的人的横坐标}和 m a x { y ∣ y 为向左走的人的横坐标 } max\{y|y为向左走的人的横坐标\} max{y∣y为向左走的人的横坐标}
接下来的问题就是如何存储数据
显然,想要对应每一个 y y y值开一个数组是不现实的
但是我们简单思考一下,发现也没必要为每一个 y y y值开一个数组
采用sort
算法,把相同 y y y值的个体连在一起就可以了
最后,AC代码如下
#include
#include
using namespace std;
const int max_n = 2e5;
const int max_x = 1e9;
const int max_y = 1e9;
const int NaN = 0x3F3F3F3F;
int n;
struct person { int x, y, dirction; }persons[max_n + 1];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> persons[i].x >> persons[i].y;
}
string str;
cin >> str;
for (int i = 0; i < n; i++) {
if (str[i] == 'R') persons[i + 1].dirction = 0;
else persons[i + 1].dirction = 1;
}
sort(persons + 1, persons + 1 + n, [](person p1, person p2) {
return p1.y < p2.y;
});
int line = -1, l = NaN, r = -1;
for (int i = 1; i <= n; i++) {
if (persons[i].y == line) {
if (persons[i].dirction) r = max(r, persons[i].x);
else l = min(l, persons[i].x);
}
else {
if (l < r) {
cout << "Yes" << endl;
return 0;
}
l = NaN; r = -1;
line = persons[i].y;
if (persons[i].dirction) r = max(r, persons[i].x);
else l = min(l, persons[i].x);
}
}
if (l < r) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}