52802023-04-25 09:48:33sztomiTornyokcpp11Időlimit túllépés 42/100500ms31460 KiB
#include <bits/stdc++.h>

using namespace std;

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

int magas[MAXN+1];
int indexek[MAXN];

int megoldas[MAXN+1];

int max_level_tav[MAXN]{0};
int szulo[MAXN];

int fenwick[MAXN+1];

void update(int ind, int val){
    while(ind < MAXN){
        fenwick[ind] += val;
        ind += ind & -ind;
    }
}

int query(int r){
    int ret = 0;
    while(r){
        ret += fenwick[r];
        r -= r & -r;
    }
    return ret;
}

int query(int l, int r){
    return query(r) - query(l-1);
}

int keres_szulo(int l, int r){
    if(l == r){
        return l;
    }
    int mid = (l+r) / 2;
    int ret = -1;
    if(query(mid+1, r) > 0){
        ret = keres_szulo(mid+1, r);
    }
    else if(query(l, mid) > 0){
        ret = keres_szulo(l, mid);
    }

    return ret;
}

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

    int n, k;
    cin >> n >> k;
    for(int i = 0; i < n; i++){
        cin >> magas[i];
        indexek[i] = i;
    }

    sort(indexek, indexek + n, [&magas](const int& a, const int &b){
                return magas[a] < magas[b];
         });

    int sz, l, r, mid;
    // nala nagyobbak indexei
    for(int i = n-1; i >= 0; --i){
        // elso nala kisebb index kell
        // 1 indexeles a fenwick fa miatt
        sz=-1;
        l = 1, r = indexek[i];
        while(l <= r){
            if(l == r){
                sz = l-1;
                break;
            }
            mid = (l+r) / 2;
            if(query(mid+1, r) > 0){
                l = mid+1;
            }
            else if(query(l, mid) > 0){
                r = mid;
            }
            else{
                sz = -1;
                break;
            }
        }
        if(sz != -1){
            szulo[i] = sz;
        }
        else{
            szulo[i] = -1;
        }
        update(indexek[i]+1, 1);
    }

    megoldas[0] = 0;
    for(int i = 1; i <= n; i++){
        if(max_level_tav[indexek[i-1]] == 0){
            max_level_tav[indexek[i-1]] = 1;
        }
        if(szulo[i-1] != -1){
            max_level_tav[szulo[i-1]] = max(max_level_tav[szulo[i-1]], max_level_tav[indexek[i-1]] + 1);
        }
        megoldas[i] = max(megoldas[i-1], max_level_tav[indexek[i-1]]);
    }

    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ÖsszpontTesztVerdiktIdőMemória
base42/100
1Elfogadva0/03ms2024 KiB
2Időlimit túllépés0/0500ms11820 KiB
3Elfogadva2/23ms2464 KiB
4Elfogadva2/23ms2820 KiB
5Elfogadva6/63ms2916 KiB
6Elfogadva6/63ms3100 KiB
7Elfogadva4/439ms5708 KiB
8Elfogadva4/470ms8060 KiB
9Elfogadva8/8236ms22168 KiB
10Időlimit túllépés0/8462ms31460 KiB
11Időlimit túllépés0/5472ms12944 KiB
12Időlimit túllépés0/5449ms13620 KiB
13Elfogadva5/5141ms12592 KiB
14Elfogadva5/5314ms23264 KiB
15Időlimit túllépés0/5462ms17380 KiB
16Időlimit túllépés0/5472ms12492 KiB
17Időlimit túllépés0/5448ms13204 KiB
18Időlimit túllépés0/5469ms14468 KiB
19Időlimit túllépés0/5476ms14560 KiB
20Időlimit túllépés0/5469ms15516 KiB
21Időlimit túllépés0/5472ms15556 KiB
22Időlimit túllépés0/5465ms15816 KiB