Submission #1212437

#TimeUsernameProblemLanguageResultExecution timeMemory
1212437qilbyCat Exercise (JOI23_ho_t4)C++20
41 / 100
35 ms8644 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 200009;

ll n, h[N], w[N], f[N], lft[N], rgt[N];

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);

    cin >> n;

    for (int i = 1; i <= n; i++) {
        cin >> h[i];
        w[h[i]] = i;
    }

    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
    }

    vector < int > v;

    for (int i = 1; i <= n; i++) {
        while (!v.empty() && h[v.back()] <= h[i]) v.pop_back();
        if (v.empty()) lft[i] = 0; else lft[i] = v.back();
        v.push_back(i);
    }

    v.clear();

    for (int i = n; i >= 1; i--) {
        while (!v.empty() && h[v.back()] <= h[i]) v.pop_back();
        if (v.empty()) rgt[i] = n + 1; else rgt[i] = v.back();
        v.push_back(i);
    }

    for (int x = 1; x <= n; x++) {
        f[lft[w[x]]] = max(f[lft[w[x]]], f[w[x]] + abs(lft[w[x]] - w[x]));
        f[rgt[w[x]]] = max(f[rgt[w[x]]], f[w[x]] + abs(rgt[w[x]] - w[x]));
    }

    cout << *max_element(f + 1, f + n + 1);
}

#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...