代码源oj 705. 碰撞2

705. 碰撞2

2022/4/5 每日一题

​ 在 xy 坐标系中有 N 个人,第 i 个人的位置是 (Xi,Yi),并且每个人的位置都不同。

​ 我们有一个由 L 和 R 组成的长为 N 的字符串 S,Si= R 代表第 i 个人面向右,Si= L 代表第 i 个人面向左。

​ 现在所有人开始朝着他们各自面向的方向走,即面向右 x 就增,面向左 x 就减。

​ 例如,当 (X1,Y1)=(2,3),(X2,Y2)=(1,1),(X3,Y3)=(4,1),S= RRL 时,人们的移动如图。
请添加图片描述
​ 我们把两个人对向行走到一个位置称为一次碰撞。请问如果人们可以无限走下去,会有人产生碰撞吗?

输入格式

第一行一个整数 N;
​ 接下来 N 行,每行两个整数 Xi 和 Yi,表示第 i 个人的位置;
最后一行是一个由 L 和 R 组成的长为 N 的字符串 S。

输出格式

​ 如果会有碰撞,输出 Yes,否则输出 No。

样例输入 1

3
2 3
1 1
4 1
RRL

样例输出 1

Yes

样例输入 2

2
1 1
2 1
RR

样例输出 2

No

样例输入 3

10
1 3
1 4
0 0
0 2
0 4
3 1
2 4
4 2
4 4
3 3
RLRRRLRLRR
样例输出 3
Yes

数据规模
​ 所有数据保证 2 ≤ N ≤ 2×105,0 ≤ Xi ≤ 109,0 ≤ Yi ≤ 109

思路

大概思路就是,因为是横向走的,所以按照y轴大小升序排序,y轴坐标相同的就按照x轴坐标排序,为了知道走的方向我加了一个标记,记录原始的序号。

现在想想其实可以在结构体里面直接加一个 char 变量记录方向就可以了?

排序之后就遍历结构体数组,之后判断就好了。

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>

#include<iostream>
#include<algorithm>
using namespace std;

const int N = 2e5 + 1;
struct aa {
	int x;
	int y;
	int cnt;
}a[N];
typedef struct aa ST;

bool cmp (ST a, ST b) {
	if (a.y != b.y)
		return a.y < b.y;
	
	return a.x < b.x;
}

char s[N];
int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d%d", &a[i].x, &a[i].y);
		a[i].cnt = i;
	}
	scanf("%s", s);
	sort(a, a + n, cmp);
	
	for (int i = 0; i < n - 1; i++) {
		if (a[i].y == a[i + 1].y) {
			if (s[a[i].cnt] == 'R' && s[a[i + 1].cnt] == 'L') {
				printf("Yes\n");
				return 0;
			}
		}
	}
	printf("No\n");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值