92822024-02-19 18:15:27AblablablaÓvodacpp17Hibás válasz 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";
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base17/50
1Elfogadva0/03ms2088 KiB
2Hibás válasz0/06ms2660 KiB
3Elfogadva2/23ms2232 KiB
4Elfogadva2/23ms2336 KiB
5Részben helyes1/23ms2524 KiB
6Elfogadva2/23ms2776 KiB
7Futási hiba0/23ms3080 KiB
8Hibás válasz0/23ms3044 KiB
9Elfogadva2/23ms3288 KiB
10Elfogadva2/23ms3408 KiB
11Elfogadva2/23ms3364 KiB
12Részben helyes1/23ms3496 KiB
13Futási hiba0/23ms3716 KiB
14Hibás válasz0/33ms3600 KiB
15Futási hiba0/312ms5100 KiB
16Futási hiba0/327ms8204 KiB
17Elfogadva3/337ms7136 KiB
18Futási hiba0/357ms12988 KiB
19Hibás válasz0/370ms10804 KiB
20Hibás válasz0/371ms11992 KiB
21Hibás válasz0/389ms14616 KiB
22Futási hiba0/498ms24052 KiB