티스토리 뷰
728x90
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] 백준 16720 BAZE RUNNER (0) | 2019.01.20 |
---|---|
[BOJ] 백준 16719 ZOAC (2) | 2019.01.20 |
[2018 IUPC] 백준 15786 Send me the money (6) | 2018.07.26 |
[BOJ] 백준 2820 자동차 공장 (0) | 2018.07.26 |
[BOJ] 백준 14268 내리 갈굼 2 (0) | 2018.07.26 |