9558 2024. 02. 22 21:24:10 Ablablabla Óvoda cpp17 Elfogadva 50/50 130ms 25360 KiB
#include <bits/stdc++.h>
#include <iostream>

using namespace std;

int main(){

	long long n, m;
    cin >> n >> m;


	vector<long long> max_ember(m); // hany ember jatszhat egy szerepet
	for(auto &x : max_ember){
		cin >> x;
	}

	vector<long long> valasztotta(n); // ki mit valasztott
	for(auto &x : valasztotta){
		cin >> x;
		x--;
	}

	vector<long long> sir(n); // ki mennyit sir
	for(auto &x : sir){
		cin >> x;
	}
	// beolvasás vége

	vector<vector<long long>> akar(m, vector<long long>()); // melyik szerepet kik akarják
	for(long long i = 0; i < n; i++){
		akar[valasztotta[i]].push_back(i);
	}


	// elorebb kell-e legyen a, mint b?
	// siras szerint novekvo sorrendbe
	auto akar_ember_rendezo_comp = [&](long long a, long long b){
		return sir[a] < sir[b];
	};
	// !! PRIORITY_QUEUE-nál ez pont fordítva van


	vector<long long> aktDb(m);
	for(long long i = 0; i < m; i++){
		sort(akar[i].begin(), akar[i].end(), akar_ember_rendezo_comp);

		aktDb[i] = akar[i].size();
	}


	// szereprendezésre
	vector<long long> index(m);
	for(long long i = 0; i < m; i++){
		index[i] = i;
	}


	auto extra_hely = [&](long long szerep_ind){
	    return max_ember[szerep_ind] - aktDb[szerep_ind];
	};


	vector<long long> vegso(n, -1);
	vector<long long> elsok(m, 0); // akar tombon belul az elso rakhato indexe egy adott szerepre

    auto atrak = [&](long long regi_szerep, long long uj_szerep_ind){
        long long ember_ind = akar[regi_szerep][elsok[regi_szerep]];
        assert(vegso[ember_ind] == -1);
        aktDb[regi_szerep]--;
        vegso[ember_ind] = uj_szerep_ind;
        aktDb[uj_szerep_ind]++;
        elsok[regi_szerep]++;
    };

    // végigmegyünk minden nullason es rakunk bele olyant, aki tulfolyna
    long long ind = 0;
    for(long long i = m-1; i >= 0; i--){
        while(ind < m && extra_hely(ind) >= 0) ind++;
        if(ind == m) break;
        if(aktDb[i] != 0) continue;

        atrak(ind, i);
    }

    vector<long long> nem_egyedul;
    for(long long i = 0; i < n; i++){
        if(vegso[i] == -1 && aktDb[valasztotta[i]] > 1){
            nem_egyedul.push_back(i);
        }
    }
    sort(nem_egyedul.begin(), nem_egyedul.end(), akar_ember_rendezo_comp);

    // végigmegyünk az osszes nullason es rakunk bele barkit, aki nem egyedul van
    ind = 0; // most emberek indexei a nem_egyedulben
    for(long long i = m-1; i >= 0; i--){
        if(aktDb[i] != 0) continue;

        while(aktDb[valasztotta[nem_egyedul[ind]]] <= 1) ind++;
        atrak(valasztotta[nem_egyedul[ind]], i);
        ind++;
    }

    for(int i = 0; i < m; i++){
        assert(aktDb[i] != 0);
    }
    // itt mar jok a nullasok


    // a extra hely szerint novekvobe rendezi
	auto index_rend = [&](long long a, long long b){
        return extra_hely(a) < extra_hely(b);
	};

    // elvileg a nullasok keszen vannak, mostmar csak a sirokkal kell kezdeni valamit
    sort(index.begin(), index.end(), index_rend);

    ind = m-1;
    for(long long i = 0; i < m; i++){
        long long akt_i = index[i];
        long long akt_ind = index[ind];

        while(extra_hely(akt_i) < 0){
            while(extra_hely(akt_ind) <= 0){
                ind--;
                akt_ind = index[ind];
            }
            atrak(akt_i, akt_ind);
        }
    }

    long long vegso_siras = 0;
    for(long long i = 0; i < n; i++){
        vegso_siras += (vegso[i] != -1) * sir[i];
    }

    cout << vegso_siras << "\n";

    for(long long i = 0; i < n; i++){
        cout << (vegso[i] != -1 ? vegso[i] : valasztotta[i])+1 << " ";
    }
    cout << "\n";


}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 50/50
1 Elfogadva 0/0 3ms 1960 KiB
2 Elfogadva 0/0 7ms 2852 KiB
3 Elfogadva 2/2 3ms 2376 KiB
4 Elfogadva 2/2 3ms 2308 KiB
5 Elfogadva 2/2 3ms 2440 KiB
6 Elfogadva 2/2 3ms 2516 KiB
7 Elfogadva 2/2 3ms 2776 KiB
8 Elfogadva 2/2 3ms 3020 KiB
9 Elfogadva 2/2 2ms 3020 KiB
10 Elfogadva 2/2 3ms 3148 KiB
11 Elfogadva 2/2 3ms 3360 KiB
12 Elfogadva 2/2 3ms 3612 KiB
13 Elfogadva 2/2 3ms 3744 KiB
14 Elfogadva 3/3 3ms 3872 KiB
15 Elfogadva 3/3 14ms 5776 KiB
16 Elfogadva 3/3 30ms 9012 KiB
17 Elfogadva 3/3 43ms 8744 KiB
18 Elfogadva 3/3 72ms 15636 KiB
19 Elfogadva 3/3 78ms 13080 KiB
20 Elfogadva 3/3 83ms 13480 KiB
21 Elfogadva 3/3 100ms 15396 KiB
22 Elfogadva 4/4 130ms 25360 KiB