728x90
반응형
https://www.acmicpc.net/problem/2170
문제
매우 큰 도화지에 자를 대고 선을 그으려고 한다. 선을 그을 때에는 자의 한 점에서 다른 한 점까지 긋게 된다. 선을 그을 때에는 이미 선이 있는 위치에 겹쳐서 그릴 수도 있는데, 여러 번 그은 곳과 한 번 그은 곳의 차이를 구별할 수 없다고 하자.
이와 같은 식으로 선을 그었을 때, 그려진 선(들)의 총 길이를 구하는 프로그램을 작성하시오. 선이 여러 번 그려진 곳은 한 번씩만 계산한다.
입력
첫째 줄에 선을 그은 횟수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 다음 N개의 줄에는 선을 그을 때 선택한 두 점의 위치 x, y(-1,000,000,000 ≤ x < y ≤ 1,000,000,000)가 주어진다.
출력
첫째 줄에 그은 선의 총 길이를 출력한다.
선 그은 부분에 해당되는 길이를 구해 출력하는 문제이다.
정렬을 이용해서 처음부터 차례대로 연결되어있는 부분에 해당되는 길이 중 가장 왼쪽의 길이와 오른쪽 길이를 구해서 그 사이를 길이를 빼서 더해주는 방식으로 구해주면 된다,
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#define INF 9876543210
using namespace std;
typedef long long ll;
// BOJ :: https://www.acmicpc.net/problem/2170
struct node {
int from;
int to;
};
int N;
node Node[1000001];
bool compare(node A, node B) {
if (A.from == B.from) {
return A.to > B.to;
}
else {
return A.from < B.from;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> N;
int minV = -INF, maxV = -INF;
for (int i = 0; i < N; i++) cin >> Node[i].from >> Node[i].to;
sort(Node, Node + N, compare);
int Answer = 0; bool flag = false;
for (int i = 0; i < N; i++) {
if (flag) {
if (Node[i].from <= maxV) maxV = max(maxV, Node[i].to);
else {
Answer += maxV - minV;
minV = Node[i].from;
maxV = Node[i].to;
}
}
else {
flag = true;
minV = Node[i].from;
maxV = Node[i].to;
}
}
Answer += maxV - minV;
cout << Answer << endl;
return 0;
}
728x90
반응형
'BOJ > 정렬' 카테고리의 다른 글
[C/C++] 백준 - 11536번 : 줄 세우기 (0) | 2022.05.14 |
---|---|
[C/C++] 백준 - 10867번 : 중복 빼고 정렬하기 (0) | 2021.08.03 |
[C/C++] 백준 - 8979번 : 올림픽 (0) | 2021.08.01 |
[C/C++] 백준 - 2910번 : 빈도 정렬 (0) | 2021.07.31 |
[C/C++] 백준 - 7795번 : 먹을 것인가 먹힐 것인가 (0) | 2021.07.31 |