https://www.acmicpc.net/problem/2261
2261번: 가장 가까운 두 점
첫째 줄에 자연수 n(2 ≤ n ≤ 100,000)이 주어진다. 다음 n개의 줄에는 차례로 각 점의 x, y좌표가 주어진다. 각각의 좌표는 절댓값이 10,000을 넘지 않는 정수이다. 여러 점이 같은 좌표를 가질 수도
www.acmicpc.net
Tag : Sweeping
풀이
(
구한 구간의 모든 점과 현재 점의 거리로 최솟값을 갱신한다.
시간복잡도 :
이 풀이가 왜

위와 같은 직사각형에 속하는 점들만이 구간에 속하게 된다. 이
때문에
+ 솔직히 나는 못풀었는데 리프가 어거지로 풀이를 우겨넣어줘서 이해했다
전체 코드
#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define all(x) ((x).begin()), ((x).end())
#define endl '\n'
using namespace std;
using ll = long long;
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int N;cin>>N;vector<pair<int,int>>v(N);
for(auto &[i,j]:v)cin>>i>>j;sort(all(v));
int D=numeric_limits<int>::max();set<pair<int,int>>st;
for(int i=0,p=0;i<N;i++){
for(;p<i;p++){
if((v[p].fi-v[i].fi)*(v[p].fi-v[i].fi)>D)st.erase({v[p].se,v[p].fi});
else break;
}
int t=sqrt(D)+1;
auto l=st.lower_bound({v[i].se-t,-1e9});
auto r=st.upper_bound({v[i].se+t,1e9});
for(auto it=l;it!=r;it++){
D=min(D,(it->se-v[i].fi)*(it->se-v[i].fi)+(it->fi-v[i].se)*(it->fi-v[i].se));
}
st.insert({v[i].se, v[i].fi});
}
cout<<D<<endl;
}
'BOJ' 카테고리의 다른 글
[BOJ 16182] Dumae (0) | 2021.08.15 |
---|---|
[BOJ 17469] 트리의 색깔과 쿼리 (0) | 2021.08.14 |
[BOJ 2682] 최대 사이클 1 (0) | 2021.08.12 |
[Boj 1947] 선물 전달 (0) | 2020.11.19 |
[boj 1365] 꼬인 전깃줄 (0) | 2020.10.05 |