알고리즘 문제해결/BOJ

BOJ 9567 Empty Stalls

havana723 2022. 11. 7. 11:01

https://www.acmicpc.net/problem/9567

 

9567번: Empty Stalls

Farmer John's new barn consists of a huge circle of N stalls (2 <= N <= 3,000,000), numbered 0..N-1, with stall N-1 being adjacent to stall 0. At the end of each day, FJ's cows arrive back at the barn one by one, each with a preferred stall they would like

www.acmicpc.net

 

입력이 조금 귀찮게 들어오는데, 각 쿼리 당 $XY$ 마리의 소가 선호하는 stall이 입력으로 주어집니다. 최대 $N-1$ 마리의 소가 선호하는 stall이 입력으로 들어왔을 때, 비게 되는 가장 작은 stall의 번호를 출력하는 문제입니다.

 

N의 범위가 크기 때문에, 각 쿼리를 입력 받으면서 소를 배치해주는 방식은 시간초과가 발생합니다. 이를 해결하기 위해 먼저 모든 쿼리를 미리 받아 각 stall마다 선호하는 소가 몇 마리 있는지를 저장해두고, stall을 0번부터 순회하며 소를 배정해줍니다. 이후 다시 한 번 stall을 순회하며 빈 stall을 찾아줍니다. 이 경우 $\mathcal{O}(N)$의 시간에 해결할 수 있습니다.

 

각 소가 어떠한 순서로 barn에 도착하더라도 정답에는 변화가 없다는 것을 알면(=문제에서 주어짐) 쉽게 풀 수 있는 문제였던 것 같습니다.

 

아래는 코드입니다.

 

#include <bits/stdc++.h>

#define FastIO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
#define ends ' '
#define int long long

using namespace std;

int T, n, k, arr[3000010];

int32_t main(void) {
    FastIO;

#ifdef HN
    freopen("_run/in.txt", "r", stdin), freopen("_run/out.txt", "w", stdout);
#endif

    T = 1;
    //cin >> T;

    while (T--) {
        cin >> n >> k;

        for (int i = 0; i < k; i++) {
            int x, y, a, b;
            cin >> x >> y >> a >> b;
            for (int j = 1; j <= y; j++) {
                int tmp = (j * a) % n;
                tmp = (tmp + b) % n;
                arr[tmp] += x;
            }
        }

        int cows = 0;
        for (int i = 0; i < 2 * n; i++) {
            int idx = i % n;
            if (arr[idx]) {
                cows += arr[idx] - 1;
                arr[idx] = 1;
            } else if (cows) {
                cows--;
                arr[idx] = 1;
            }
        }

        int ans = n - 1;
        for (int i = 0; i < n; i++) {
            if (!arr[i]) {
                ans = i;
                break;
            }
        }

        cout << ans << endl;
    }

    return 0;
}

'알고리즘 문제해결 > BOJ' 카테고리의 다른 글

BOJ 15224 EvenOdd  (0) 2022.12.05
BOJ 11562 백양로 브레이크  (0) 2022.11.23
BOJ 17299 오등큰수  (0) 2022.11.03
BOJ 1613 역사  (0) 2022.11.01
BOJ 16929 Two Dots  (0) 2022.10.26