92822024-02-19 18:15:27AblablablaÓvodacpp17Wrong answer 17/5098ms24052 KiB
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;

struct comp1{
    bool operator()(pii a, pii b){
        return a.second > b.second;
    }
};

vector<priority_queue<pii, vector<pii>, comp1>> akar;

struct comp2{
    bool operator()(int a, int b){
        return akar[a].size() < akar[b].size();
    }
};

int main()
{
    int n, k;
    cin >> n >> k;

    vector<int> helyek(k, 0);
    for(int i = 0; i < k; i++){
        cin >> helyek[i];
    }

    vector<int> valasztott(n, 0);
    for(int i = 0; i < n; i++){
        cin >> valasztott[i];
        valasztott[i]--;
    }


    akar.assign(k, priority_queue<pii, vector<pii>, comp1>());

    vector<int> siras(n, 0);
    for(int i = 0; i < n; i++){
        cin >> siras[i];
        akar[valasztott[i]].push({i, siras[i]});
    }

    vector<int> indexek(k, 0);
    for(int i = 0; i < k; i++){
        indexek[i] = i;
    }
    sort(indexek.begin(), indexek.end(), comp2());

    int tesz = 0;
    int vesz = k - 1;
    int ido = 0;
    vector<int> eload(n, -1);

    while(akar[indexek[tesz]].size() == 0){
        while(akar[indexek[vesz]].size() <= helyek[indexek[vesz]]){
            vesz--;
        }

        akar[indexek[tesz]].push(akar[indexek[vesz]].top());
        ido += akar[indexek[vesz]].top().second;
        eload[akar[indexek[vesz]].top().first] = indexek[tesz];
        akar[indexek[vesz]].pop();

        tesz++;
    }

    /*cout << ido << " " << tesz << " " << vesz << "\n";
    for(int x : eload){
        cout << x << " ";
    }
    cout << "\n";*/

    tesz = 0;
    while(akar[indexek[vesz]].size() > helyek[indexek[vesz]]){
        while(akar[indexek[tesz]].size() == helyek[indexek[tesz]]){
            tesz++;
        }

        while(akar[indexek[vesz]].size() > helyek[indexek[vesz]]){
            akar[indexek[tesz]].push(akar[indexek[vesz]].top());
            ido += akar[indexek[vesz]].top().second;
            eload[akar[indexek[vesz]].top().first] = indexek[tesz];
            akar[indexek[vesz]].pop();
        }

        vesz--;
    }

    cout << ido << "\n";
    for(int i = 0; i < n; i++){
        cout << (eload[i] != -1 ? eload[i] : valasztott[i]) + 1 << " ";
    }
    cout << "\n";
}
SubtaskSumTestVerdictTimeMemory
base17/50
1Accepted0/03ms2088 KiB
2Wrong answer0/06ms2660 KiB
3Accepted2/23ms2232 KiB
4Accepted2/23ms2336 KiB
5Partially correct1/23ms2524 KiB
6Accepted2/23ms2776 KiB
7Runtime error0/23ms3080 KiB
8Wrong answer0/23ms3044 KiB
9Accepted2/23ms3288 KiB
10Accepted2/23ms3408 KiB
11Accepted2/23ms3364 KiB
12Partially correct1/23ms3496 KiB
13Runtime error0/23ms3716 KiB
14Wrong answer0/33ms3600 KiB
15Runtime error0/312ms5100 KiB
16Runtime error0/327ms8204 KiB
17Accepted3/337ms7136 KiB
18Runtime error0/357ms12988 KiB
19Wrong answer0/370ms10804 KiB
20Wrong answer0/371ms11992 KiB
21Wrong answer0/389ms14616 KiB
22Runtime error0/498ms24052 KiB