8525 2024. 01. 21 08:38:06 MagyarKendeSZLG Óvoda cpp17 Hibás válasz 33/50 266ms 10820 KiB

#include <bits/stdc++.h>

#pragma region Utility

#define speed cin.tie(0); ios::sync_with_stdio(0)
#define cinv(v) for (auto& e : v) cin >> e;

#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define size(v) (int)v.size()
#define has(s, e) s.count(e)

#define max_index(v) max_element(all(v)) - v.begin()
#define min_index(v) min_element(all(v)) - v.begin()
#define smax(x, y) x = max(x, y)
#define smin(x, y) x = min(x, y)

#define sum(v) accumulate(all(v), 0)
#define product(v, T) accumulate(all(v), 1, multiplies<T>())

using namespace std;
using ll = long long;
using point = array<int, 2>;

int max(point p) { return max(p[0], p[1]); }
int min(point p) { return min(p[0], p[1]); }

template <typename T>
vector<T> prefix_sum(const vector<T>& v) {
    vector<T> result(size(v));
    partial_sum(all(v), result.begin());
    return result;
}

#pragma endregion

#ifdef NATIVERUN
#define cin fin
#endif

int main() {
    #ifndef NATIVERUN
    speed;
    #else
    ifstream fin("input.txt");
    #endif

    int N, K;
    cin >> N >> K;

    vector<int> roleS(K), wantS(K);
    cinv(roleS);

    vector<int> orig_roleS = roleS;

    priority_queue<array<int, 3>> pq;
    
    vector<point> kidS(N);
    for (point& p : kidS) cin >> p[0];
    for (point& p : kidS) cin >> p[1];

    for (int i = 0; i < N; i++) {
        pq.push({kidS[i][1], kidS[i][0] - 1, i});
        wantS[kidS[i][0] - 1]++;
    }

    int total_cry = 0;
    vector<int> result(N);

    while (!pq.empty()) {
        auto [cry, kid, i] = pq.top(); pq.pop();

        if (cry == 0) {
            bool put = 0;
            for (int j = 0; j < K; j++) {
                if (roleS[j] == orig_roleS[j]) {
                    roleS[j]--;
                    result[i] = j;
                    put = 1;
                    break;
                }
            }
            if (put) continue;
            for (int j = 0; j < K; j++) {
                if (roleS[j] > 0) {
                    roleS[j]--;
                    result[i] = j;
                    break;
                }
            }
        }
        else if (roleS[kid] > 0) {
            roleS[kid]--;
            wantS[kid]--;
            result[i] = kid;
        } 
        else {
            total_cry += cry;
            pq.push({0, -1, i});
        }
    }

    cout << total_cry << '\n';
    for (int x : result) cout << x + 1 << ' ';
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 33/50
1 Elfogadva 0/0 3ms 1960 KiB
2 Elfogadva 0/0 4ms 2548 KiB
3 Elfogadva 2/2 3ms 2356 KiB
4 Elfogadva 2/2 3ms 2568 KiB
5 Elfogadva 2/2 3ms 2716 KiB
6 Elfogadva 2/2 2ms 2708 KiB
7 Hibás válasz 0/2 2ms 2708 KiB
8 Elfogadva 2/2 3ms 2936 KiB
9 Elfogadva 2/2 2ms 2936 KiB
10 Elfogadva 2/2 3ms 3064 KiB
11 Elfogadva 2/2 2ms 3092 KiB
12 Elfogadva 2/2 3ms 3220 KiB
13 Hibás válasz 0/2 3ms 3344 KiB
14 Elfogadva 3/3 3ms 3340 KiB
15 Hibás válasz 0/3 14ms 4352 KiB
16 Hibás válasz 0/3 118ms 5440 KiB
17 Elfogadva 3/3 27ms 5980 KiB
18 Hibás válasz 0/3 39ms 7380 KiB
19 Elfogadva 3/3 82ms 8308 KiB
20 Elfogadva 3/3 76ms 8440 KiB
21 Elfogadva 3/3 266ms 8888 KiB
22 Hibás válasz 0/4 67ms 10820 KiB