λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
λ°±μ€€/Gold

[BOJ] 24453 : 디버깅

by Jaeguk 2022. 2. 18.
문제 링크

24453번: 디버깅 (acmicpc.net)

 

24453번: 디버깅

첫 μ€„μ—λŠ” μžλ™μœΌλ‘œ μž‘μ„±λœ μ½”λ“œ μ€„μ˜ 수 $N$κ³Ό 였λ₯˜κ°€ μžˆλŠ” μ€„μ˜ 개수 $M$이 μ£Όμ–΄μ§„λ‹€. $(1 \le N \le 2 \times 10^7$, $1 \le M \le \min(N,\ 5\times 10^5))$ 두 번째 μ€„μ—λŠ” μ½”λ“œμ—μ„œ 였λ₯˜κ°€ μžˆλŠ” μ€„μ˜ 번호 $M$κ°œκ°€

www.acmicpc.net

μΈκ·œκ°€ Y개 μ΄μƒμ˜ 였λ₯˜λ₯Ό μ œκ±°ν•œ ν›„ 에디터가 μ œκ±°ν•΄μ•Ό ν•  였λ₯˜μ˜ 수의 μ΅œλŒ€κ°’μ„ κ΅¬ν•˜λŠ” 문제.

풀이

λ¨Όμ € 경우의 수λ₯Ό λ‚˜λˆ„μ–΄ 보자.

1. μΈκ·œκ°€ μ•„λ¬΄λŸ° 였λ₯˜λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šμ•„λ„ 에디터가 μžλ™μœΌλ‘œ 였λ₯˜λ₯Ό μˆ˜μ •ν•΄ 쀄 수 μžˆλŠ” 경우

즉, 졜초 μž…λ ₯μ—μ„œ λΆ€ν„° 이미 였λ₯˜κ°€ μ—†λŠ” μ—°μ†λœ μ½”λ“œμ˜ μ€„μ˜ μˆ˜κ°€ X이상인 μƒνƒœ.

이런 κ²½μš°λŠ” μΈκ·œκ°€ μ΅œμ†Œ Y개의 였λ₯˜λŠ” μˆ˜μ •ν•΄μ•Όν•˜λ―€λ‘œ 아무 였λ₯˜ Y개λ₯Ό μˆ˜μ •ν•œλ‹€.

그럼 μ—λ””ν„°λŠ” μ΅œλŒ€ M - Y 개λ₯Ό ν•΄κ²°ν•΄μ•Όν•œλ‹€. 

2. μΈκ·œκ°€ Y개 μ΄ν•˜μ˜ 였λ₯˜λ§Œ μˆ˜μ •ν•΄μ£Όλ©΄ 에디터가 μžλ™μœΌλ‘œ 였λ₯˜λ₯Ό μˆ˜μ •ν•΄ 쀄 수 μžˆλŠ” 경우

μΈκ·œκ°€ Yμ΄ν•˜ 개의 였λ₯˜λ§Œ μˆ˜μ •ν•΄μ£Όλ©΄ 였λ₯˜ μ—†λŠ” μ—°μ†λœ μ½”λ“œ μ€„μ˜ μˆ˜κ°€ X이상이 λ˜λŠ” κ²½μš°μ΄λ‹€

이런 경우 μ—­μ‹œ μ—λ””ν„°λŠ” μ΅œλŒ€ M - Y개의 였λ₯˜λ₯Ό ν•΄κ²°ν•΄μ•Όν•œλ‹€. 

3. μΈκ·œκ°€ Y개λ₯Ό μ΄ˆκ³Όν•΄μ„œ 였λ₯˜λ₯Ό μˆ˜μ •ν•΄μ•Όλ§Œ 에디터가 ν•΄κ²°ν•΄ 쀄 수 μžˆλŠ” 경우

이 경우 에디터가 μ΅œλŒ€ (M - μΈκ·œκ°€ 이미 ν•΄κ²°ν•œ 였λ₯˜μ˜ 수) 만큼의 였λ₯˜λ₯Ό ν•΄κ²°ν•΄μ•Όν•œλ‹€.

즉, μΈκ·œκ°€ Y개λ₯Ό μ΄ˆκ³Όν•΄ 였λ₯˜λ₯Ό μˆ˜μ •ν•΄μ•Όν•˜λŠ”λ° κ·Έ μ€‘μ—μ„œλ„ μ΅œλŒ€ν•œ 적게 였λ₯˜λ₯Ό μˆ˜μ •ν•΄μ•Όν•œλ‹€.

1번의 κ²½μš°μ—λŠ” μž…λ ₯을 받은 후에 λ°”λ‘œ νŒλ³„ν•΄μ£Όμ—ˆλ‹€. μ£Όμ–΄μ§„ 두 였λ₯˜ μ‚¬μ΄μ˜ 간격을 계산해

κ·Έ 쀑에 μ΅œλŒ€ 길이λ₯Ό μ°Ύμ•„μ„œ νŒλ³„ν•΄μ£Όλ©΄ λœλ‹€.

 

1번의 κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ μΈκ·œκ°€ λ°˜λ“œμ‹œ 손을 λŒ€μ•Όν•˜λŠ” κ²½μš°μ— μ΅œμ†Œ λͺ‡ 개의 였λ₯˜λ₯Ό ν•΄κ²°ν•΄μ•Ό

이후엔 에디터가 μžλ™μœΌλ‘œ 해결해쀄지λ₯Ό κ³„μ‚°ν•΄μ•Όν•œλ‹€. 였λ₯˜μ—†λŠ” μ—°μ†λœ μ½”λ“œ 쀄 μˆ˜κ°€ Xμ€„λ§Œ 있으면 λœλ‹€.

Xκ°€ 3이라고 κ°€μ •ν•˜μž

1~3, 4~6, 7~9 ... N-2 ~ N 으둜 λ²”μœ„λ₯Ό λ‚˜λˆ„μ–΄μ„œ λ²”μœ„μ•ˆμ˜ 였λ₯˜ 개수 쀑 μ΅œμ†Œλ₯Ό 찾으면 λœλ‹€.

κ·Έλ ‡κ²Œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄λ©΄

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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <map>
#define mod 1000000007
using namespace std;
typedef long long ll;
const int INF = INT_MAX;
const int MAX_N = 20000000 + 5;
int N, M, X, Y;
bool Error[MAX_N];
vector<int> Error_num;
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> M;
    int MAX_gap = 0;
    for (int i = 0; i < M; i++) {
        int a; cin >> a;
        Error[a] = true;
        Error_num.push_back(a);
        if (!i) MAX_gap = max(a - 1, MAX_gap);
        else MAX_gap = max(MAX_gap, a - (Error_num[i - 1+ 1));
        if (i == M - 1) {
            MAX_gap = max(MAX_gap, N - a);
        }
    }
    cin >> X >> Y;
    if (MAX_gap >= X) {
        cout << M - Y << "\n";
        return 0;
    }
    int cnt = 0;
    for (int j = 1; j < 1 + X; j++) {
        if (Error[j])
            cnt++;
    }
    int Min_Error = cnt;
    for (int i = 2; i <= N - X + 1; i++) {
        if (Error[i - 1])
            cnt--;
        if (Error[i + X - 1])
            cnt++;
        Min_Error = min(cnt, Min_Error);
        if (Min_Error < Y)
            break;
    }
    if (Min_Error < Y)
        cout << M - Y << "\n";
    else cout << M - Min_Error << "\n";
    return 0;
}
cs

μ—¬κΈ°μ„œ λ²”μœ„λ‚΄μ˜ μ—λŸ¬ 수λ₯Ό 찾을 λ•Œ

맀번 λ°˜λ³΅λ¬Έμ„ λŒλ©΄μ„œ 개수λ₯Ό μ„Έλ©΄ μ‹œκ°„μ œν•œμ΄ 0.6μ΄ˆλ°–μ— μ•ˆλΌμ„œ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚œλ‹€.

1~3 κΉŒμ§€λŠ” 반볡문으둜 개수λ₯Ό μ„Έμ£Όκ³  cnt λ³€μˆ˜μ— μ €μž₯ν•œλ‹€.

λ‹€μŒ 2~4 κΉŒμ§€ μ…€λ•ŒλŠ” μ•žμ„œ 1~3 λ²”μœ„μ™€ 2,3이 κ²ΉμΉœλ‹€.

κ·Έλž˜μ„œ 1λ²ˆμ€„μ— μ—λŸ¬κ°€ μžˆμ—ˆλ‹€λ©΄ 일단 cnt-1을 ν•΄μ£Όκ³  4λ²ˆμ€„μ— μ—λŸ¬κ°€ μžˆλ‹€λ©΄ cnt+1을 ν•΄μ£Όλ©΄λœλ‹€.

그럼 맀번 λ°˜λ³΅λ¬Έμ„ λŒμ§€μ•Šκ³ λ„ λ²”μœ„ λ‚΄ 였λ₯˜μ˜ 수λ₯Ό 계산할 수 μžˆλ‹€.

728x90