928 2022. 01. 28 14:59:14 Valaki2 Óvoda cpp14 Elfogadva 50/50 64ms 20356 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pb push_back
#define mp make_pair
#define fi first
#define se second

int n, k;
vector<int> limit;
vector<int> wanted;
vector<int> cry;

vector<vector<int> > v;

vector<int> ans;

bool sortbycry(int a, int b) {
    return cry[a] < cry[b];
}

void solve() {
    cin >> n >> k;
    limit.assign(1 + k, 0);
    wanted.assign(1 + n, 0);
    cry.assign(1 + n, 0);
    for(int i = 1; i <= k; i++) {
        cin >> limit[i];
    }
    for(int i = 1; i <= n; i++) {
        cin >> wanted[i];
    }
    for(int i = 1; i <= n; i++) {
        cin >> cry[i];
    }
    v.assign(1 + n, vector<int> (0, 0));
    ans = wanted;
    for(int i = 1; i <= n; i++) {
        v[wanted[i]].pb(i);
    }
    vector<int> changed;
    for(int i = 1; i <= k; i++) {
        sort(v[i].begin(), v[i].end(), sortbycry);
        reverse(v[i].begin(), v[i].end());
        if(limit[i] < (int) v[i].size()) {
            for(int j = limit[i]; j < (int) v[i].size(); j++) {
                changed.pb(v[i][j]);
            }
            v[i].resize(limit[i]);
        }
    }
    int idx = 0, cnt = 0;
    vector<int> unused;
    for(int i = 1; i <= k; i++) {
        if(((int) v[i].size()) == 0) {
            if(idx < (int) changed.size()) {
                ans[changed[idx]] = i;
                v[i].pb(changed[idx]);
                idx++;
            } else {
                cnt++;
                unused.pb(i);
            }
        }
    }
    if(idx < (int) changed.size()) {
        for(int i = 1; i <= k; i++) {
            while((limit[i] > (int) v[i].size()) && (idx < (int) changed.size())) {
                ans[changed[idx]] = i;
                v[i].pb(changed[idx]);
                idx++;
            }
        }
    } else if(cnt > 0) {
        vector<int> options;
        for(int i = 1; i <= k; i++) {
            for(int j = 1; j < (int) v[i].size(); j++) {
                options.pb(v[i][j]);
            }
        }
        sort(options.begin(), options.end(), sortbycry);
        for(int i = 0; i < cnt; i++) {
            ans[options[i]] = unused[i];
        }
    }
    int ans_cry = 0;
    for(int i = 1; i <= n; i++) {
        if(ans[i] != wanted[i]) {
            ans_cry += cry[i];
        }
    }
    cout << ans_cry << "\n";
    for(int i = 1; i <= n; i++) {
        cout << ans[i] << " ";
    }
    cout << "\n";
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 50/50
1 Elfogadva 0/0 2ms 1820 KiB
2 Elfogadva 0/0 4ms 2296 KiB
3 Elfogadva 2/2 1ms 1912 KiB
4 Elfogadva 2/2 1ms 1916 KiB
5 Elfogadva 2/2 1ms 1920 KiB
6 Elfogadva 2/2 1ms 1920 KiB
7 Elfogadva 2/2 1ms 1928 KiB
8 Elfogadva 2/2 1ms 1952 KiB
9 Elfogadva 2/2 1ms 1956 KiB
10 Elfogadva 2/2 1ms 1960 KiB
11 Elfogadva 2/2 1ms 1948 KiB
12 Elfogadva 2/2 1ms 1948 KiB
13 Elfogadva 2/2 2ms 2012 KiB
14 Elfogadva 3/3 1ms 2028 KiB
15 Elfogadva 3/3 7ms 3464 KiB
16 Elfogadva 3/3 16ms 5864 KiB
17 Elfogadva 3/3 18ms 6812 KiB
18 Elfogadva 3/3 39ms 10760 KiB
19 Elfogadva 3/3 32ms 11524 KiB
20 Elfogadva 3/3 39ms 14024 KiB
21 Elfogadva 3/3 45ms 15424 KiB
22 Elfogadva 4/4 64ms 20356 KiB