답안 #854471

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
854471 2023-09-27T17:20:35 Z vjudge1 Sjekira (COCI20_sjekira) C++17
0 / 110
62 ms 14940 KB
//author: Ahmet Alp Orakci
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
#define int i64

#define ONLINE_JUDGE
void solve(int n) {
    vector <int> vec(n +1);
    for(int i = 1; i <= n; i++)
        cin >> vec[i];

    set <int> adj[n +1];
    for(int i = 1; i <= n -1; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].emplace(v);
        adj[v].emplace(u);
    }

    function <int(int, int)> dfsMax = [&](int node, int par) -> int {
        int ind = node;
        for(const int &child : adj[node]) {
            if(child != par) {
                int g = dfsMax(child, node);
                //cerr << child << " " << node << " :: " << g << "\n";
                if(vec[g] >= vec[ind]) {
                    ind = g;
                }
            }
        }

        return ind;
    };

    int res = 0;
    function <void(int)> dfsAns = [&](int node) -> void {
        //cerr << "# " << node << "\n";
        int cev = 0;
        vector <int> vvec;
        for(const int &child : adj[node]) {
            cev += vec[node];
            int g = dfsMax(child, node);
            cerr << child << " " << node << " :: " << g << "\n";
            cev += vec[g];
            adj[child].erase(node);
            vvec.emplace_back(child);
        }

        adj[node].clear();

        for(int &i : vvec) {
            dfsAns(dfsMax(i, node));
        }

        //cerr << node << " " << cev << "\n";
        res += cev;
    };

    dfsAns(dfsMax(1, 0));

    cout << res;
    
    return;
}

void solve2(int n) {
    vector <int> vec(n +5, 0);
    for(int i = 1; i <= n; i++)
        cin >> vec[i];

    set <int> adj[n +1];
    for(int i = 1; i <= n -1; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].emplace(v);
        adj[v].emplace(u);
    }

    auto f = [&](int a, int b) -> int {
        if(vec[a] <= vec[b]) {
            return b;
        }
        return a;
    };
    
    vector <int> ST(n * 4 + 5);
    function <int(int, int, int)> build = [&](int node, int l, int r) -> int {
        if(l == r) {
            return ST[node] = r;
        }

        int mid = (l + r) / 2;
        return ST[node] = f(build(node * 2, l, mid), build(node * 2 +1, mid +1, r));
    };

    build(1, 1, n);
    
    function <int(int, int, int, int, int)> get = [&](int node, int l, int r, int ql, int qr) -> int {
        if(r < ql || qr < l) {
            return 0;
        } else if(ql <= l && r <= qr) {
            return ST[node];
        }

        int mid = (l + r) / 2;
        return f(get(node * 2, l, mid, ql, qr), get(node * 2 +1, mid +1, r, ql, qr));
    };

    int ans = 0;
    function <void(int, int)> dfs = [&](int l, int r) -> void {
        //cerr << l << " " << r << "\n";
        if(r <= l) {
            return;
        } else if(r == l +1) {
            ans += vec[l] + vec[r];
            return;
        }

        int g = get(1, 1, n, l, r);
        //cerr << l << " " << r << " " << g << "\n";
        int cev = 0;
        cev += vec[get(1, 1, n, l, g -1)];
        cev += vec[get(1, 1, n, g +1, r)];
        cev += vec[g] * 2;

        ans += cev;

        //cerr << l << " " << r << " :: " << cev << "\n";

        dfs(l, g -1);
        dfs(g +1, r);
    };

    dfs(1, n);
    cout << ans;
}

signed main() {
    #ifndef ONLINE_JUDGE
        freopen(".in", "r", stdin);
        freopen(".out", "w", stdout);
    #endif

    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    int t = 1; //cin >> t;
    for(int i = 1; i <= t; i++) {
        int n;
        cin >> n;
        //if(n <= 1000)
        //    solve(n);
        //else 
            solve2(n);
    }

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 62 ms 14940 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -