3216 2023. 02. 22 17:18:10 sztomi Szurikáta (45) cpp11 Elfogadva 45/45 23ms 4732 KiB
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;

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


    int n, p, q;
    cin >> n >> p >> q;
    vector<int> helyek(n);
    for(int& x : helyek){
        cin >> x;
    }
    vector<int> magassagok(n);
    for(int& x : magassagok){
        cin >> x;
    }

    vector<double> meredekseg(n);
    for(int i = 0; i < n; i++){
        meredekseg[i] = (double)(magassagok[i] - p) / helyek[i];
    }
    vector<int> lat;
    lat.push_back(0);
    for(int i = 1; i < n; i++){
        if(meredekseg[i] > meredekseg[lat.back()]){
            lat.push_back(i);
        }
    }

    int db;
    int hol, mennyit;
    while(q--){
        cin >> db;
        vector<double> ujak(db);
        // valodi index, ujakon beluli index
        // melyik szurikatak, akik tutira kilatszanak egymas mogul
        vector<pii> uj_lat;
        for(int i = 0; i < db; i++){
            cin >> hol >> mennyit;
            hol--;
            ujak[i] = (double)(magassagok[hol] + mennyit - p) / helyek[hol];
            if(uj_lat.size() == 0 || ujak[i] > ujak[uj_lat.back().second]){
                uj_lat.push_back({hol, i});
            }
        }

        //cout << "---------------------------------------\n";
        // kivalogatjuk azokat az emelkedokat,amik kilatszanak az alap cucc mogul
        vector<pii> latszok;
        for(int i = 0; i < uj_lat.size(); i++){
            // megkeressuk azt a helyet, ami utan kerulne
            int kerul = -1;
            int l = 0, r = lat.size()-1;
            while(l <= r){
                int mid = (l + r) / 2;
                if(lat[mid] < uj_lat[i].first){
                    kerul = mid;
                    l = mid + 1;
                }
                else{
                    r = mid - 1;
                }
            }
            //cout << "ujlat " << uj_lat[i].first << " " << uj_lat[i].second << "\n";
            //cout << "kerul: " << kerul << "\n";
            //cout << "meredek1: " << meredekseg[lat[kerul]] << "\n";
            //cout << "meredek2: " << ujak[uj_lat[i].second] << "\n";

            // megnezzuk egyaltalan latszik-e
            if(kerul != -1){
                if(meredekseg[lat[kerul]] < ujak[uj_lat[i].second]){
                    //cout << "nem latszik\n";
                    latszok.push_back(uj_lat[i]);
                }
            }
            else{
                latszok.push_back(uj_lat[i]);
            }
        }

        int ki = lat.size();
        for(int i = 0; i < latszok.size(); i++){
            //cout << "latszik " << latszok[i].first << " " << latszok[i].second << "\n";
            // megkeressuk, hogy ki utan kerulne
            int kerul = -1;
            int l = 0, r = lat.size()-1;
            while(l <= r){
                int mid = (l + r) / 2;
                if(lat[mid] < latszok[i].first){
                    kerul = mid;
                    l = mid + 1;
                }
                else{
                    r = mid - 1;
                }
            }

            int kovi_hely;
            if(i == latszok.size()-1){
                kovi_hely = n;
            }
            else{
                kovi_hely = latszok[i+1].first;
            }

            // megkeressuk, hogy melyik az utolso, amelyiket eltakarna
            int vege = -1;
            l = kerul+1;
            r = lat.size()-1;
            while(l <= r){
                int mid = (l+r) / 2;
                // ne szamoljunk duplan semmit, ezert csak a kovetkezo emelkedoig nezzuk
                if(lat[mid] >= kovi_hely){
                    r = mid-1;
                    continue;
                }
                if(meredekseg[lat[mid]] <= ujak[latszok[i].second]){
                    vege = mid;
                    l = mid + 1;
                }
                else{
                    r = mid - 1;
                }
            }

            //cout << "kerul: " << kerul << " vege: " << vege << "\n";

            ki++;
            if(vege != -1){
                ki -= vege - (kerul+1) + 1;
            }
        }

        //cout << "ki: " << ki << "\n";
        //cout << "------------------------------------\n";
        cout << ki << " ";
    }
    cout << "\n";
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 45/45
1 Elfogadva 0/0 3ms 1828 KiB
2 Elfogadva 0/0 8ms 2184 KiB
3 Elfogadva 2/2 3ms 2244 KiB
4 Elfogadva 2/2 3ms 2452 KiB
5 Elfogadva 2/2 4ms 2812 KiB
6 Elfogadva 2/2 8ms 3144 KiB
7 Elfogadva 2/2 8ms 3360 KiB
8 Elfogadva 4/4 17ms 3976 KiB
9 Elfogadva 4/4 14ms 4064 KiB
10 Elfogadva 4/4 14ms 4404 KiB
11 Elfogadva 4/4 14ms 4316 KiB
12 Elfogadva 4/4 17ms 4380 KiB
13 Elfogadva 5/5 19ms 4384 KiB
14 Elfogadva 5/5 21ms 4528 KiB
15 Elfogadva 5/5 23ms 4732 KiB