Submission #832482

#TimeUsernameProblemLanguageResultExecution timeMemory
832482fatemetmhrRadio Towers (IOI22_towers)C++17
11 / 100
4073 ms5984 KiB
// komak!

#include "towers.h"
#include <bits/stdc++.h>

using namespace std;

#define debug(x) cerr << "(" << (#x) << "): " << (x) << endl;
#define all(x)   x.begin(), x.end()
#define fi       first
#define se       second
#define mp       make_pair
#define pb       push_back

typedef long long ll;

const ll mod   = 1e9 + 7;
const int maxn5 = 1e5 + 10;

int mxid, h[maxn5];
int n, dp[maxn5], dp2[maxn5];
pair <int, int> per[maxn5];

void solve(int l, int r, int d){
    if(r <= l)
        return;
    int mid = l;
    for(int i = l + 1; i < r; i++)
        if(h[i] > h[mid])
            mid = i;
    solve(l, mid, d);
    solve(mid + 1, r, d);
    for(int i = l; i < r; i++)
        per[i] = {h[i], i};
    sort(per + l, per + r);
    int mx1 = 0, mx2 = 0;
    for(int i = l; i < r; i++){
        if(per[i].se < mid)
            mx1 = max(mx1, dp[per[i].se]);
        if(per[i].se > mid)
            mx2 = max(mx2, dp[per[i].se]);
        dp2[i] = max(mx1, mx2);
        if(per[i].fi + d <= per[r - 1].fi)
            dp2[i] = mx1 + mx2;
    }
    dp2[r - 1] = max(dp2[r - 1], 1);
    for(int i = l; i < r; i++){
        h[i] = per[i].fi;
        dp[i] = dp2[i];
    }
}

void init(int N, std::vector<int> H) {

    mxid = 0;
    n = N;
    for(int i = 0; i < n; i++){
        h[i] = H[i];
        if(h[i] > h[mxid])
            mxid = i;
    }

}

int max_towers(int l, int r, int d) {

    solve(l, r + 1, d);
    return (*max_element(dp, dp + n));

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...