95482024-02-22 21:01:21AblablablaÓvodacpp17Hibás válasz 33/50126ms18900 KiB
#include <bits/stdc++.h>
#include <iostream>

using namespace std;

int main(){

	int n, m;
    cin >> n >> m;


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

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

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

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

	//cout << "1\n";

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


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

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

	//cout << "1\n";

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

	//cout << "1\n";

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

    // a nullasokat a vegere
    // azon kivul a tulfolyas szerint csokkenobe
	auto index_rend = [&](int a, int b){

		if(aktDb[a] == 0 && aktDb[b]){
			return false;
		} else if(aktDb[b] == 0 && aktDb[a]){
			return true;
		} else if(aktDb[a] == 0 && aktDb[b] == 0){
		    return a < b;
		}

        return extra_hely(a) < extra_hely(b);
	};


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

    auto atrak = [&](int regi_szerep, int uj_szerep_ind){
        int 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]++;
        //cout << "ddd " << aktDb[regi_szerep] << " " << regi_szerep << " " << aktDb[uj_szerep_ind] << " " << uj_szerep_ind << "\n";
    };

    // végigmegyünk minden nullason es rakunk bele olyant, aki tulfolyna
    int ind = 0;
    for(int 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);
    }
    //cout << "d1\n";

    vector<int> nem_egyedul;
    for(int i = 0; i < n; i++){
        if(vegso[i] == -1 && aktDb[valasztotta[i]] > 1){
            nem_egyedul.push_back(i);
        }
    }
    //cout << "d2\n";
    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(int i = m-1; i >= 0; i--){
        if(ind == nem_egyedul.size()) break;
        if(aktDb[i] != 0) continue;

        atrak(valasztotta[nem_egyedul[ind]], i);
        ind++;
    }
    //cout << "d3\n";

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

    //cout << "d5\n";
    ind = m-1;
    for(int i = 0; i < m; i++){
        int akt_i = index[i];
        int akt_ind = index[ind];

        while(extra_hely(akt_i) < 0){
            //cout << "dd1\n";
            while(ind > 0 && extra_hely(akt_ind) <= 0){
                ind--;
                akt_ind = index[ind];
            }
            //cout << "dd2\n";

            //cout << "dd3\n";
            //cout << akt_i << " " << m << " " << elsok[akt_i] << " " << akt_ind << " " << extra_hely(akt_ind) << " " << aktDb[akt_i] << " " << aktDb[akt_ind] << "\n";
            atrak(akt_i, akt_ind);
            //cout << "dd4\n";
        }
    }
    //cout << "d4\n";

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

    cout << vegso_siras << "\n";

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


}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base33/50
1Elfogadva0/03ms2084 KiB
2Elfogadva0/07ms2704 KiB
3Elfogadva2/23ms2260 KiB
4Elfogadva2/23ms2432 KiB
5Elfogadva2/23ms2648 KiB
6Elfogadva2/23ms2856 KiB
7Hibás válasz0/23ms2936 KiB
8Elfogadva2/23ms3068 KiB
9Elfogadva2/23ms3152 KiB
10Elfogadva2/23ms3152 KiB
11Elfogadva2/23ms3276 KiB
12Elfogadva2/23ms3360 KiB
13Hibás válasz0/23ms3540 KiB
14Elfogadva3/33ms3580 KiB
15Hibás válasz0/314ms4936 KiB
16Hibás válasz0/330ms7020 KiB
17Elfogadva3/341ms6756 KiB
18Hibás válasz0/371ms11936 KiB
19Elfogadva3/375ms8792 KiB
20Elfogadva3/382ms8848 KiB
21Elfogadva3/397ms10628 KiB
22Hibás válasz0/4126ms18900 KiB