문제 정리
- (1, 1) -> (n, m) 이동
- 매초 상하좌우 이동 또는 안 움직
- 레이저는 최대 2개
- 자율 방법로봇, 센서에 닿아도 된다
로봇에 잡히면 안 된다
-> 최대한 빠르게 이동해야 한다
-> n*m번만에 이동해야 한다
-> 직접 한 칸씩 확인하면 100,000 * 10^9 시간 초과
- x는 무조건 오른쪽으로만 이동
- L, R 범위 확인해서 오른쪽으로 넘어갈 수 있는지 확인
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#include <stdio.h>
#include <math.h>
#include <sstream>
#include<cassert>
#include <climits>
#include <tuple>
#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()
#define MAXV 987654321
#define FOR(i, n) for(int i = 0; i < (n); ++i)
using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;
int main() {
int n, m;
scanf("%d %d", &n, &m);
// 나의 위치 x
int x = 1;
FOR(i, n-1) {
int a;
scanf("%d", &a);
if (a == 0) continue;
vector<pair<int, char>> v(a);
FOR(i, a) {
scanf("%d %c", &v[i].xx, &v[i].yy);
if (v[i].yy == 'L') v[i].xx += 1;
else v[i].xx -= 1;
}
if (a == 1) {
if (v[0].yy == 'L') x = max(x, v[0].xx);
else {
if (v[0].xx < x) {
printf("NO\n");
return 0;
}
}
continue;
}
if (v[0].yy == 'R' && v[1].yy == 'L') {
if (v[0].xx < x) x = max(x, v[1].xx);
continue;
}
for (auto& vi: v) {
if (vi.yy == 'L') x = max(x, vi.xx);
else {
if (vi.xx < x) {
printf("NO\n");
return 0;
}
}
}
}
if (m < x) printf("NO\n");
else printf("YES\n");
return 0;
}
'백준' 카테고리의 다른 글
28176 Maximum GCD (0) | 2023.09.17 |
---|---|
11607 Grid (0) | 2023.09.16 |
22956 소나기 (0) | 2023.08.12 |
10403 Intrepid climber (0) | 2023.08.12 |
24049 정원 (Easy) (0) | 2023.08.05 |