http://acmicpc.net/problem/2069
2069번: 보이는 산맥
첫째 줄에 N이 입력된다. 둘째 줄부터 N+1번째 줄까지, 각각의 줄에는 산 하나를 표현하는 왼쪽 꼭짓점의 x좌표, 아래쪽 꼭짓점의 x좌표가 공백을 사이에 두고 입력된다. 입력으로 주어지는 x좌표
www.acmicpc.net
정렬을 이용해 푸는 문제 였습니다.
입력으로 주어지는 산의 x좌표 두 개를 우리는 1차원 좌표위에 선분으로 생각 할 수 있습니다. 따라서 선분의 양 끝 좌표가 주어질때 겹치는부분을 제외한 선분의 총 길이를 구하는 것과 유사하다고 볼 수 있습니다. 그렇게 바꿔서 생각하면 문제가 훨씬 쉬워집니다. 먼저 선분의 왼쪽 좌표에 대해 정렬을 합니다. 어떤 선분을 탐색할때 그 선분의 왼쪽 좌표보다 왼쪽에서 시작하는 선분이 없다는게 보장됩니다. 따라서 우리는 그 이전에 나온 선분중에서 가장 오른쪽에 있는 끝점과 현재 탐색중인 선분의 시작점을 비교함으로써 겹치는 부분이 얼마나 있는지 알 수 있습니다.
#include<stdio.h>
#include<vector>
#include<math.h>
#include<algorithm>
#include<bitset>
#include<string>
#include<iostream>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<functional>
using namespace std;
void fast_io() {
cin.tie(0)->sync_with_stdio(0);
}
int main(){
fast_io();
int N;
cin>>N;
vector<pair<int,int>> vec;
for(int x=0;x<N;x++){
int a,b;
cin>>a>>b;
vec.push_back({a,b});
}
sort(vec.begin(),vec.end());
long long ans=(vec[0].second-vec[0].first);
int r=vec[0].second;
ans*=ans;
for(int x=1;x<N;x++){
long long now=vec[x].second-vec[x].first;
now*=now;
if(vec[x].first<r){
long long s=(r-vec[x].first);
s*=s;
now-=s;
if(vec[x].second<=r) now=0;
}
ans+=now;
r=max(r,vec[x].second);
}
cout<<ans;
}
'PS > boj' 카테고리의 다른 글
백준 22985 문자열 조작의 달인 (0) | 2022.07.18 |
---|---|
백준 15559 내 선물을 받아줘 (0) | 2022.07.17 |
백준 1994 등차수열 (C++) (0) | 2022.07.14 |
백준 3678 카탄의 개척자 (C++) (0) | 2022.07.13 |
백준 1744 수 묶기 (C++) (0) | 2022.07.12 |