티스토리 뷰
https://www.acmicpc.net/problem/10165
[문제조건]
버스 정류소의 개수 N(3 ≤ N ≤ 1,000,000,000), 버스 노선의 수 M(2 ≤ M ≤ 500,000)
각 버스의 노선 [a,b] 단, 0 ≤ a,b ≤ N-1이고 a ≠ b
[문제풀이]
조건 a ≠ b 로 인하여 각 버스의 노선 [a,b]를 두 분류로 나눌수가 있다.
\[\displaystyle \begin{cases}a<b & nonePassZeroZone\\a>b & passZeroZone\end{cases}\]
ZeroZone == [n-1,0]
그룹 A의 특징으로는 (n-1)번과 0번사이 도로를 지나가지 않으며,
그룹 B의 특징으로는 (n-1)번과 0번사이 도로를 무조건 지나간다.
따라서 그룹A는 그룹 B를 포함할수 없는점을 알수가 있으며,
그룹 B가 그룹A를 포함하는 경우를 고려해야한다.
그룹B의 특징을 이용하여 그룹A의 노선의 생략가능조건을 파악해보자
1. 그룹A의 노선 끝점이 그룹B의 노선 끝점 이하일때
2. 그룹A의 노선 시작점이 그룹B의 노선 시작점 이상일때
위 조건 이외에도 그룹A노선끼리 생략되는지 그룹B노선끼리 생략되는지도 확인해보아야 한다. (코드참조)
더보기
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
typedef struct pair<int, pair<int, int>> pii; // {index, {start,end}}
bool cmp(const pii& a, const pii& b)
{
if (a.second.first == b.second.first)
return a.second.second > b.second.second;
return a.second.first < b.second.first;
}
int main()
{
int n, m, b_start = 1e9+5, b_end = 0;
scanf("%d %d", &n,&m);
vector<bool> isCancel(m, false);
vector <pii> A, B;
for (int i = 0; i < m; i++) {
int st, en;
scanf("%d %d", &st, &en);
if (st < en) {
A.push_back({ i,{st,en} });
}
else {
B.push_back({ i,{st,en + n} });
b_start = min(st, b_start);
b_end = max(en, b_end);
}
}
sort(A.begin(), A.end(), cmp);
sort(B.begin(), B.end(), cmp);
int aSize = A.size(), aMax = -1;
for (int i = 0; i < aSize; i++) {
pair<int, int> range = A[i].second;
if (range.second <= aMax || range.first >= b_start || range.second <= b_end)
isCancel[A[i].first] = true;
aMax = max(range.second, aMax);
}
int bSize = B.size(), bMax = -1;
for (int i = 0; i < bSize; i++) {
pair<int, int> range = B[i].second;
if (range.second <= bMax)
isCancel[B[i].first] = true;
bMax = max(range.second, bMax);
}
for (int i = 0; i < m; i++) {
if (!isCancel[i])
printf("%d ", i + 1);
}
return 0;
}
'백준 문제풀이' 카테고리의 다른 글
백준[baekjoon] 8462 (0) | 2020.05.27 |
---|---|
백준[baekjoon] 14728 (0) | 2020.05.02 |
백준[baekjoon] 12865 (0) | 2020.04.20 |
백준[baekjoon] 1390 (0) | 2020.01.19 |
백준[baekjoon] 14641 (0) | 2020.01.11 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- C++게임개발
- 퀸 움직이기
- DP
- 언리얼 자동화
- ICPC 후기
- 초등부
- 언리얼 프로젝트 재생성
- 숫자판 만들기
- 백준 27469
- BOJ 27469
- C++게임
- 브레젠험 알고리즘
- pygame
- unreal enigne
- 정보올림피아드
- opengl
- 홍정모의 게임 만들기 연습 문제 패키지
- 코드포스
- tetris
- Python
- Unreal Engine
- BOJ 2365
- 언리얼 프로젝트 재생성 자동화
- 테트리스
- OpenVDB
- 백준 2365
- 백준
- ndisplay
- UE5.3
- Codeforces
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함