제출 #1344024

#제출 시각아이디문제언어결과실행 시간메모리
1344024nguyenkhangninh99Cat Exercise (JOI23_ho_t4)C++20
41 / 100
143 ms38792 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 2e5 + 5;
int st[4 * maxn], p[maxn];
vector<int> adj[maxn];

void build(int id, int l, int r){
    if(l == r) st[id] = l;
    else{
        int mid = (l + r) / 2;
        build(id * 2, l, mid);
        build(id * 2 + 1, mid + 1, r);
        
        if(p[st[id * 2]] > p[st[id * 2 + 1]]) st[id] = st[id * 2];
        else st[id] = st[id * 2 + 1];
    }
}
int get(int id, int l, int r, int u, int v){
    if(v < l || r < u) return 0;
    if(u <= l && r <= v) return st[id];
    
    int mid = (l + r) / 2;
    int lpos = get(id * 2, l, mid, u, v), rpos = get(id * 2 + 1, mid + 1, r, u, v);
    return (p[lpos] > p[rpos]) ? lpos : rpos;
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int n; cin >> n;

    vector<int> deg(n + 1), a(n + 1);
    for(int i = 1; i <= n; i++) cin >> a[i];

    for(int i = 1; i <= n - 1; i++){
        int u, v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
        deg[u]++, deg[v]++;
    }
    int cur = 1, pre = 0;
    for(int i = 1; i <= n; i++){
        if(deg[i] == 1){
            cur = i;
            break;
        }
    }

    for(int i = 1; i <= n; i++){
        p[i] = a[cur]; 
        for(int v: adj[cur]){
            if(v != pre){
                pre = cur;
                cur = v;
                break;
            }
        }
    }

    build(1, 1, n);
    function<int(int, int)> solve = [&](int l, int r) -> int {
        if(l >= r) return 0; 
        int mid = get(1, 1, n, l, r), ans = 0;
        if(l < mid) ans = max(ans, mid - get(1, 1, n, l, mid - 1) + solve(l, mid - 1));
        if(mid < r) ans = max(ans, get(1, 1, n, mid + 1, r) - mid + solve(mid + 1, r));
        return ans;
    };

    cout << solve(1, n) << "\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...