본문 바로가기

백준/탐색

[KOI] 백준 8983 - 사냥꾼

728x90
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<intint>;
 
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
728x90

'백준 > 탐색' 카테고리의 다른 글

백준 1522 - 문자열 교환  (0) 2022.07.18
[KOI] 백준 2503 - 숫자 야구  (0) 2022.06.22
[KOI] 백준 2502 - 떡 먹는 호랑이  (0) 2022.05.26
백준 4160 - 이혼  (0) 2022.01.16
[ICPC] 백준 20047 - 동전 옮기기  (0) 2021.10.09