93992024-02-21 12:46:55AblablablaÓvodacpp17Runtime error 8/50500ms20492 KiB
#include <bits/stdc++.h>

using namespace std;

vector<int> siras;

struct comp{
    bool operator()(int a, int b){
        return siras[a] > siras[b];
    }
};

vector<priority_queue<int, vector<int>, comp>> akar;
vector<int> helyek;

int ertek(int a){
    return helyek[a] - (int)akar[a].size();
}

struct comp2{
    bool operator()(int a, int b){
        return ertek(a) < ertek(b);
    }
};

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

    helyek.assign(m, 0);
    for(int &x : helyek){
        cin >> x;
    }

    siras.assign(n, 0);
    akar.assign(m, priority_queue<int, vector<int>, comp>());

    vector<int> ment(n);
    priority_queue<int, vector<int>, comp> osszes;
    for(int i = 0; i < n; i++){
        osszes.push(i);
        cin >> ment[i];
    }

    for(int &x : siras){
        cin >> x;
    }

    for(int i = 0; i < n; i++){
        int a = ment[i];
        a--;

        akar[a].push(i);
    }

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

    int vesz = 0;
    vector<int> vegso(n, -1);
    int ido = 0;

    for(int i = 0; i < m; i++){
        if(akar[i].size() != 0) continue;

        if(ertek(indexek[vesz]) < 0){
            // vehetunk innen is
        } else if(ertek(indexek[vesz + 1]) < 0){
            // vehetunk eggyel arrebrol
            vesz++;
        } else{
            // nincs olyan hely amit tobben akarnak jatszani mint a max
        }

        if(ertek(indexek[vesz]) < 0){
            akar[i].push(akar[indexek[vesz]].top());
            vegso[akar[indexek[vesz]].top()] = i;
            ido += siras[akar[indexek[vesz]].top()];
            akar[indexek[vesz]].pop();
        } else{
            while(!osszes.empty() && vegso[osszes.top()] != -1){
                osszes.pop();
            }

            while(osszes.empty()){}

            vegso[osszes.top()] = i;
            akar[i].push(osszes.top());
            ido += siras[osszes.top()];
            osszes.pop();
        }
    }

    sort(indexek.begin(), indexek.end(), comp2());

    vesz = 0;
    int tesz = n - 1;

    while(vesz < m && ertek(indexek[vesz]) < 0){
        while(tesz >= 0 && ertek(indexek[tesz]) > 0){
            tesz--;
        }

        while(tesz == 0){} // elvileg lehetetlen

        while(ertek(indexek[vesz]) < 0){
            akar[indexek[tesz]].push(akar[indexek[vesz]].top());
            ido += siras[akar[indexek[vesz]].top()];
            vegso[akar[indexek[vesz]].top()] = indexek[tesz];
            akar[indexek[vesz]].pop();
        }

        vesz++;
    }

    cout << ido << "\n";

    for(int i = 0; i < n; i++){
        if(vegso[i] != -1){
            cout << vegso[i] + 1 << " ";
        } else{
            cout << ment[i] << " ";
        }
    }
    cout << "\n";
}
SubtaskSumTestVerdictTimeMemory
base8/50
1Accepted0/03ms1812 KiB
2Runtime error0/06ms2452 KiB
3Time limit exceeded0/2456ms2324 KiB
4Accepted2/23ms2596 KiB
5Time limit exceeded0/2500ms2440 KiB
6Accepted2/23ms2668 KiB
7Wrong answer0/22ms2756 KiB
8Time limit exceeded0/2500ms2720 KiB
9Accepted2/22ms2764 KiB
10Accepted2/22ms2768 KiB
11Runtime error0/23ms2732 KiB
12Runtime error0/23ms2876 KiB
13Wrong answer0/23ms3184 KiB
14Time limit exceeded0/3499ms3196 KiB
15Wrong answer0/314ms4652 KiB
16Wrong answer0/332ms7336 KiB
17Runtime error0/332ms5924 KiB
18Wrong answer0/371ms12084 KiB
19Runtime error0/357ms7940 KiB
20Time limit exceeded0/3477ms5148 KiB
21Runtime error0/375ms9800 KiB
22Wrong answer0/4134ms20492 KiB