5287 2023. 04. 25 12:21:33 sztomi Tornyok cpp11 Elfogadva 100/100 273ms 63100 KiB
#include<bits/stdc++.h>

using namespace std;

const int MAXN = 1e6+10;
const int MAXK = 1e5;
const int INF = 1e9+7;

int n, k;
int magas[MAXN+1];
int indexek[MAXN];

bool aktiv[MAXN]{false};
int max_hossz[MAXN];

int megoldas[MAXN];
int elso[MAXN];
int utolso[MAXN];

int unio(int bal, int kozep, int jobb){
    bool a = (bal >= 0 && aktiv[bal]);
    bool b = (jobb < n && aktiv[jobb]);
    int ret = 1;
    if(a && b){ // XOX
        bal = elso[bal];
        jobb = elso[jobb];
        ret = max(max_hossz[bal], max_hossz[jobb] + 1);

        max_hossz[bal] = ret;
        elso[utolso[jobb]] = bal;
        utolso[bal] = utolso[jobb];
    }
    else if(a){ // XO_
        bal = elso[bal];
        ret = max_hossz[bal];

        max_hossz[bal] = ret;
        elso[kozep] = bal;
        utolso[bal] = kozep;
    }
    else if(b){ // _OX
        jobb = elso[jobb];
        ret = max_hossz[jobb] + 1;

        max_hossz[kozep] = ret;
        elso[utolso[jobb]] = kozep;
        utolso[kozep] = utolso[jobb];
    }
    return ret;
}

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

    cin >> n >> k;
    for(int i = 0; i < n; i++){
        cin >> magas[i];
        indexek[i] = i;
        max_hossz[i] = 1;
        elso[i] = utolso[i] = i;
    }
    sort(indexek, indexek+n, [&magas](const int &a, const int & b){
            return magas[a] < magas[b];
         });

    if(n == 1){
        int kerdes;
        for(int i = 0; i < k; i++){
            cin >> kerdes;
            cout << (magas[0] < kerdes) << " ";
        }
        return 0;
    }

    vector<int> rel_magas(n);
    for(int i = 0; i < n; i++){
        rel_magas[indexek[i]] = i;
    }

    megoldas[0] = 0;
    megoldas[1] = 1;
    int ind;
    aktiv[indexek[0]] = true;
    int mo = 1;
    for(int i = 2; i <= n; i++){
        int prev_ind = indexek[i-1]; // hova lett lerakva az elotte levo

        aktiv[prev_ind] = true;
        mo = max(mo, unio(prev_ind-1, prev_ind, prev_ind+1));

        /*
        cout << "---------------------------\n";
        cout << "i: " << i << " mo: " << mo << "\n";
        for(int j = 0; j < n; j++){
            cout << (aktiv[j] ? "X" : " ") << "\t";
        }
        cout << "\n";
        for(int j = 0; j < n; j++){
            cout << rel_magas[j] << "\t";
        }
        cout << "\n";
        for(int j = 0; j < n; j++){
            cout << elso[j] << "\t";
        }
        cout << "\n";
        for(int j = 0; j < n; j++){
            cout << utolso[j] << "\t";
        }
        cout << "\n";
        for(int j = 0; j < n; j++){
            cout << max_hossz[elso[j]] << "\t";
        }
        cout << "\n";
        cout << "----------------------------\n";
        */

        megoldas[i] = mo;
    }

/*
    for(int i = 0; i <= n; i++){
        cout << i << ": " << megoldas[i] << "\n";
    }
*/


    vector<int> kerdesek(k);
    vector<int> kerdes_ind(k);
    for(int i = 0; i < k; i++){
        cin >> kerdesek[i];
        kerdes_ind[i] = i;
    }
    sort(kerdes_ind.begin(), kerdes_ind.end(), [&kerdesek](const int &a, const int &b){
            return kerdesek[a] < kerdesek[b];
         });

    vector<int> valasz(k);

    magas[n] = INF;
    int temp_ind = 0;
    for(int i = 0; i <= n; i++){
        while(temp_ind < k && kerdesek[kerdes_ind[temp_ind]] <= magas[indexek[i]]){
            valasz[kerdes_ind[temp_ind]] = megoldas[i];
            temp_ind++;
        }
    }

    for(int i = 0; i < k; i++){
        cout << valasz[i] << " ";
    }
    cout << "\n";
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 100/100
1 Elfogadva 0/0 3ms 1732 KiB
2 Elfogadva 0/0 222ms 50908 KiB
3 Elfogadva 2/2 3ms 2280 KiB
4 Elfogadva 2/2 3ms 2608 KiB
5 Elfogadva 6/6 3ms 2792 KiB
6 Elfogadva 6/6 3ms 2968 KiB
7 Elfogadva 4/4 14ms 6088 KiB
8 Elfogadva 4/4 20ms 8640 KiB
9 Elfogadva 8/8 70ms 25992 KiB
10 Elfogadva 8/8 115ms 37208 KiB
11 Elfogadva 5/5 208ms 51080 KiB
12 Elfogadva 5/5 250ms 60096 KiB
13 Elfogadva 5/5 48ms 14288 KiB
14 Elfogadva 5/5 93ms 26856 KiB
15 Elfogadva 5/5 125ms 38616 KiB
16 Elfogadva 5/5 186ms 44000 KiB
17 Elfogadva 5/5 226ms 52588 KiB
18 Elfogadva 5/5 270ms 61944 KiB
19 Elfogadva 5/5 273ms 62284 KiB
20 Elfogadva 5/5 200ms 62384 KiB
21 Elfogadva 5/5 202ms 62704 KiB
22 Elfogadva 5/5 172ms 63100 KiB