728x90
https://www.acmicpc.net/problem/8983
풀이
각 동물과 사대들의 거리를 생각해보자.
사대들과의 거리를 그래프 형태로 그리면 다음과 같은 형태가 나옴을 눈치챌 수 있다.
그래프의 형태는 유니모달 함수이며 우리는 삼분 탐색으로 닿을 수 있는 가장 짧은 사대를 찾을 수 있음을 알 수 있다.
사대의 좌표를 정렬한 후 입력받은 동물 좌표마다 삼분 탐색을 실시하여 피격당할 수 있는 동물의 마릿수를 구하면 된다.
전체 코드
더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,avx2,fma")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include "bits/stdc++.h"
#include "ext/rope"
using namespace std;
using namespace __gnu_cxx;
using ll = long long;
using pii = pair<int, int>;
int m, n, range;
int ar[100000];
void solve()
{
cin >> m >> n >> range;
int ans = 0;
for (int i = 0; i < m; i++)
{
cin >> ar[i];
}
sort(ar, ar + m);
for (int i = 0; i < n; i++)
{
ll x, y;
cin >> x >> y;
int l = 0, r = m - 1;
bool nice = false;
while (l <= r)
{
int diff = (r - l) / 3;
int p1 = l + diff;
int p2 = r - diff;
ll dist1 = abs(x - ar[p1]) + y;
ll dist2 = abs(x - ar[p2]) + y;
if (dist1 <= range or dist2 <= range)
{
nice = true;
break;
}
if (dist1 > dist2)
{
l = p1 + 1;
}
else
{
r = p2 - 1;
}
}
ans += nice;
}
cout << ans;
}
int main()
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
cin.tie(nullptr);
ios::sync_with_stdio(false);
solve();
}
|
cs |
제출 기록
728x90
'백준 > 탐색' 카테고리의 다른 글
백준 9825 - MODSUM (0) | 2024.11.16 |
---|---|
백준 1522 - 문자열 교환 (0) | 2022.07.18 |
[KOI] 백준 2503 - 숫자 야구 (0) | 2022.06.22 |
[KOI] 백준 2502 - 떡 먹는 호랑이 (0) | 2022.05.26 |
백준 4160 - 이혼 (0) | 2022.01.16 |