4765 2023. 03. 31 11:28:30 Albertstein99 Óvoda cpp17 Hibás válasz 38/50 105ms 51000 KiB
#include <bits/stdc++.h>
using namespace std;
typedef pair<long long, long long> pii;
typedef vector<pii> vpii;
typedef vector<vpii> vvpii;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    ///READING IN DATA
    long long N, K;
    cin >> N >> K;
    vector <long long> M(K + 1);
    for(long long i = 1; i <= K; i++)
        cin >> M[i];
    vector <long long> S(N + 1);
    for(long long i = 1; i <= N;i++)
        cin >> S[i];
    vector <long long> T(N + 1);
    for(long long i = 1; i <= N;i++)
        cin >> T[i];
    ///STORING DATA IN NEW VARIABLES
    vvpii R(K + 1);
    for(long long i = 1; i <= N; i++)
        R[S[i]].push_back({T[i], i});
    for(auto &x : R)
        sort(x.begin(), x.end());
    ///ASSIGNING EVERYONE A ROLE
    vector <long long> extras;
    for(long long i = 1; i <= K; i++)
        for(long long j = R[i].size(); j < M[i]; j++)
            extras.push_back(i);
    long long db = 1;
    for(long long i = 1; i < extras.size(); i++){
        if(extras[i] != extras[i - 1]) db++;
    }
    long long x = 0, y = 0;
    vector <long long> Xtra(extras.size());
    Xtra[x++] = extras[0];
    for(long long i = 1; i < extras.size(); i++){
        if(extras[i] != extras[i - 1]) Xtra[x++] = extras[i];
        else Xtra[db + y++] = extras[i];
    }
    vector <long long> P(N + 1);
    long long p = 0;
    for(long long i = 1; i <= K; i++){
        long long num = max((signed long long)(R[i].size() - M[i]), 0ll);
        for(long long j = 0; j < num; j++)
            P[R[i][j].second] = Xtra[p++];
        for(long long j = num; j < R[i].size(); j++)
            P[R[i][j].second] = i;
    }
    ///MAKING SURE EVERY ROLE HAS A PERSON ASSIGNED
    vvpii F(K + 1);
    for(long long i = 1; i <= N; i++){
        F[P[i]].push_back({T[i], i});
    }
    for(auto &x : F){
        sort(x.begin(), x.end(), greater<pii>());
    }
    vector <long long> needs;
    for(long long i = 1; i <= K; i++)
        if(F[i].empty())
            needs.push_back(i);
    vpii usable;
    for(long long i = 1; i <= K; i++){
        for(long long j = 1; j < F[i].size(); j++)
            usable.push_back(F[i][j]);
    }
    ///REASSIGNING ROLES
    sort(usable.begin(), usable.end());
    for(long long i = 0; i < needs.size(); i++){
        P[usable[i].second] = needs[i];
    }
    ///CALCULATING DISSATISFCATION
    long long cry = 0;
    for(long long i = 1; i <= N; i++){
        if(S[i] != P[i])
            cry += T[i];
    }
    cout << cry << "\n";
    for(long long i = 1; i <= N; i++)
        cout << P[i] << " ";
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 38/50
1 Elfogadva 0/0 3ms 1832 KiB
2 Hibás válasz 0/0 6ms 3628 KiB
3 Elfogadva 2/2 3ms 2268 KiB
4 Hibás válasz 0/2 3ms 2504 KiB
5 Elfogadva 2/2 3ms 2700 KiB
6 Futási hiba 0/2 3ms 3004 KiB
7 Elfogadva 2/2 3ms 3132 KiB
8 Elfogadva 2/2 2ms 3228 KiB
9 Elfogadva 2/2 3ms 3424 KiB
10 Elfogadva 2/2 3ms 3636 KiB
11 Elfogadva 2/2 3ms 3824 KiB
12 Elfogadva 2/2 3ms 3916 KiB
13 Hibás válasz 0/2 3ms 4092 KiB
14 Elfogadva 3/3 3ms 4052 KiB
15 Hibás válasz 0/3 10ms 7084 KiB
16 Hibás válasz 0/3 19ms 11544 KiB
17 Elfogadva 3/3 32ms 16476 KiB
18 Elfogadva 3/3 54ms 29592 KiB
19 Elfogadva 3/3 54ms 22836 KiB
20 Elfogadva 3/3 59ms 23208 KiB
21 Elfogadva 3/3 71ms 26424 KiB
22 Elfogadva 4/4 105ms 51000 KiB