4835 2023. 03. 31 13:31:30 ZsofiaKeresztely Óvoda cpp14 Elfogadva 50/50 116ms 18740 KiB
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int, int>
#define fi first
#define se second

/*
10 1
10
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
*/

int main()
{
    int kids, roles;
    cin >> kids >> roles;
    vector<int> places(roles), pref(kids), op(kids, -1), wasnt;
    vector<vector<pii> > cry(roles);
    vector<pii> left, fix;
    for (int i=0; i<roles; i++){
        cin >> places[i];
    }
    for (int i=0; i<kids; i++){
        cin >> pref[i];
    }
    for (int i=0; i<kids; i++){
        int a;
        cin >> a;
        cry[pref[i]-1].push_back({a, i});
    }
    long long crysum = 0;
    for (int i=0; i<roles; i++){
        if (!cry[i].size()){
            wasnt.push_back(left.size());
            left.push_back({places[i], i});
            continue;
        }
        sort(cry[i].rbegin(), cry[i].rend());
        op[cry[i][0].se] = i;
        for (int j=1; j<min((int)cry[i].size(), places[i]); j++){
            op[cry[i][j].se] = i;
            fix.push_back(cry[i][j]);
        }
        for (int j=min((int)cry[i].size(), places[i]); j<cry[i].size(); j++){
            crysum += cry[i][j].fi;
        }
        if (places[i] > cry[i].size()){
            left.push_back({places[i] - cry[i].size(), i});
        }
    }
    int lind = 0, opind = 0;
    while (lind < wasnt.size()){
        while (opind < kids && op[opind] >= 0){
            opind++;
        }
        if (opind == kids) break;
        op[opind] = left[wasnt[lind]].se;
        left[wasnt[lind]].fi--;
        lind++;
    }
    if (lind < wasnt.size()){
        sort(fix.begin(), fix.end());
        for (int i=lind; i<wasnt.size(); i++){
            crysum += fix[i-lind].fi;
            op[fix[i-lind].se] = left[wasnt[i]].se;
            left[wasnt[i]].fi--;
        }
    }
    lind = 0;
    while (opind < kids){
        while (lind < left.size() && !left[lind].fi) lind++;
        if (lind == left.size()) break;
        while (opind < kids && op[opind] >= 0) opind++;
        if (opind == kids) break;
        op[opind] = left[lind].se;
        left[lind].fi--;
        opind++;
    }
    cout << crysum << "\n";
    for (int i=0; i<kids; i++){
        cout << op[i] + 1 << " ";
    }
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 50/50
1 Elfogadva 0/0 3ms 1808 KiB
2 Elfogadva 0/0 7ms 2652 KiB
3 Elfogadva 2/2 3ms 2388 KiB
4 Elfogadva 2/2 3ms 2644 KiB
5 Elfogadva 2/2 3ms 2768 KiB
6 Elfogadva 2/2 3ms 2776 KiB
7 Elfogadva 2/2 3ms 2988 KiB
8 Elfogadva 2/2 3ms 3200 KiB
9 Elfogadva 2/2 2ms 3284 KiB
10 Elfogadva 2/2 3ms 3472 KiB
11 Elfogadva 2/2 3ms 3832 KiB
12 Elfogadva 2/2 3ms 3864 KiB
13 Elfogadva 2/2 3ms 4056 KiB
14 Elfogadva 3/3 3ms 3896 KiB
15 Elfogadva 3/3 14ms 5132 KiB
16 Elfogadva 3/3 28ms 7068 KiB
17 Elfogadva 3/3 37ms 7084 KiB
18 Elfogadva 3/3 68ms 11692 KiB
19 Elfogadva 3/3 65ms 10236 KiB
20 Elfogadva 3/3 71ms 10400 KiB
21 Elfogadva 3/3 89ms 11828 KiB
22 Elfogadva 4/4 116ms 18740 KiB