티스토리 뷰
728x90
문제 링크
https://www.acmicpc.net/problem/15922
문제를 풀기 위해 수직선들을 좌표가 낮은 순으로 정렬하자. 그리고 앞의 수직선부터 탐색한다.
인접한 두 수직선의 관계는 다음과 같다.
빨간 선의 양 끝점을 s, e라 하고 파란 선의 양 끝점을 ns, ne라 하자.
①은 s≤ns & ne≤e인 경우이고, 더 작은 선분을 무시하는걸로 해결할 수 있다.
②는 ns<e인 경우이고, 두 선분의 길이의 합에 중복된 e−ns의 값을 빼줌으로써 해결할 수 있다.
③의 경우엔 그냥 둘 다 더하면 된다.
파란 선은 현재 내가 보고있는 선분, 빨간 선이 파란 선분의 바로 직전 선분이다.
정답 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <algorithm> | |
#include <vector> | |
using namespace std; | |
using ll = long long; | |
const ll INF = 0x3f3f3f3f; | |
int n; | |
vector<pair<ll, ll>> p; | |
int main() { | |
ios_base::sync_with_stdio(false); | |
cin.tie(0); | |
cin >> n; | |
ll s, e; | |
for (int i = 0; i < n; i++) { | |
cin >> s >> e; | |
p.emplace_back(s, e); | |
} | |
sort(p.begin(), p.end()); | |
ll ans = 0; | |
s = -INF, e = -INF; | |
for(int i=0;i<p.size(); i++){ | |
auto cur = p[i]; | |
ll ns = cur.first, ne = cur.second; | |
if (s <= ns && ne <= e)continue; // case 1 | |
ans += ne - ns; | |
if (ns < e) { // case 2 | |
ans -= (e - ns); | |
} | |
s = ns; | |
e = ne; | |
} | |
cout << ans; | |
} |
질문, 피드백 환영합니다.
728x90
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[BOJ] 백준 15925 욱제는 정치쟁이야!! (2) | 2018.07.25 |
---|---|
[BOJ] 백준 15924 욱제는 사과팬이야!! (0) | 2018.07.25 |
[BOJ] 백준 15921 수찬은 마린보이야!! (0) | 2018.07.25 |
[BOJ] 백준 15920 선로에 마네킹이야!! (0) | 2018.07.25 |
[BOJ] 백준 15918 랭퍼든 수열쟁이야!! (2) | 2018.07.25 |