31922023-02-22 10:12:14sztomiÜgyfélszolgálat (45)cpp11Időlimit túllépés 10/45899ms7004 KiB
#include <bits/stdc++.h>

using namespace std;

typedef pair<long long, int> pii;

struct comp{
    bool operator()(pii a, pii b){
        if(a.first == b.first) return a.second > b.second;
        return a.first > b.first;
    }
};

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int m, n;
    cin >> m >> n;
    // egy priority_queueban taroljuk a pultokat
    // {elso szabad idopont, pult szama}
    priority_queue<pii, vector<pii>, comp> pultok;
    for(int i = 1; i <= m; i++){
        pultok.push({0, i});
    }

    long long nap_vege = 0;
    long long legtobb_varas = 0;
    vector<int> kiszolgalo_pult(n);
    // {idopont, nyit vagy zar}
    vector<pii> varakozok;

    long long erkezes, hossz;
    pii pult, ideigl;
    int legkozelebb;
    long long pult_ido;
    long long vart, vegzett;
    for(int i = 0; i < n; i++){
        cin >> erkezes >> hossz;

        // a legkorabban szabadon levo pulthoz megyunk
        // ha tobb pult szabad, akkor a legkisebbet kene valasztani
        pult_ido = pultok.top().first;
        // osszes olyan pultot, ami az erkezesig van meg kell vizsgalni
        // lehetne optimalisabban is, ha kulon eltarolnank az erkezes elott szabad pultokat
        // de remelem igy is atmegy
        if(pult_ido <= erkezes){
            vector<pii> szabadok;
            int legjobb = 1e9;
            while(!pultok.empty()){
                ideigl = pultok.top();
                if(ideigl.first > erkezes) break;
                pultok.pop();
                szabadok.push_back(ideigl);
                legjobb = min(legjobb, ideigl.second);
            }
            for(auto akt : szabadok){
                if(akt.second == legjobb){
                    pult = akt;
                }
                else{
                    pultok.push(akt);
                }
            }
        }
        else{
            pult = pultok.top();
            pultok.pop();
        }


        vart = max((long long)0, pult.first-erkezes);
        vegzett = erkezes + vart + hossz;

        nap_vege = max(nap_vege, vegzett);
        legtobb_varas = max(legtobb_varas, vart);
        kiszolgalo_pult[i] = pult.second;

        if(vart > 0){
            varakozok.push_back({erkezes, 1});
            varakozok.push_back({erkezes+vart, -1});
        }
        pultok.push({vegzett, pult.second});
    }

    int legtobben_egyszerre_varok = 0;
    sort(varakozok.begin(), varakozok.end());
    varakozok.push_back({-1, -1});
    int epp_varnak = 0;
    for(int i = 0; i < varakozok.size()-1; i++){
        epp_varnak += varakozok[i].second;
        if(varakozok[i].first != varakozok[i+1].first){
            legtobben_egyszerre_varok = max(legtobben_egyszerre_varok, epp_varnak);
        }
    }


    cout << nap_vege << " " << legtobb_varas << " " << legtobben_egyszerre_varok << "\n";
    for(int x : kiszolgalo_pult){
        cout << x << "\n";
    }

}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base10/45
1Elfogadva0/03ms1828 KiB
2Időlimit túllépés0/0899ms1932 KiB
3Elfogadva2/23ms2232 KiB
4Elfogadva2/23ms2656 KiB
5Elfogadva2/23ms2872 KiB
6Elfogadva2/23ms3136 KiB
7Elfogadva2/26ms3424 KiB
8Időlimit túllépés0/2861ms5600 KiB
9Időlimit túllépés0/2875ms5748 KiB
10Időlimit túllépés0/2865ms5844 KiB
11Időlimit túllépés0/2878ms6212 KiB
12Időlimit túllépés0/2856ms5992 KiB
13Időlimit túllépés0/2856ms6340 KiB
14Időlimit túllépés0/2867ms6348 KiB
15Időlimit túllépés0/2836ms6348 KiB
16Időlimit túllépés0/2873ms6628 KiB
17Időlimit túllépés0/2870ms6676 KiB
18Időlimit túllépés0/2861ms6720 KiB
19Időlimit túllépés0/2837ms6932 KiB
20Időlimit túllépés0/3873ms6916 KiB
21Időlimit túllépés0/4874ms7004 KiB
22Időlimit túllépés0/4865ms6944 KiB