Submission #854473

# Submission time Handle Problem Language Result Execution time Memory
854473 2023-09-27T17:24:58 Z vjudge1 Sjekira (COCI20_sjekira) C++17
10 / 110
128 ms 36400 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 (1 <= b && b <= n) ? b : a;
        }
        return a;
    };
    
    vector <int> ST((n + 10) * 4);
    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 + 5);
    
    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;
        }

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

        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;
}
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 68 ms 14892 KB Output is correct
2 Correct 50 ms 11612 KB Output is correct
3 Correct 52 ms 11100 KB Output is correct
4 Correct 56 ms 12368 KB Output is correct
5 Correct 83 ms 18456 KB Output is correct
6 Correct 128 ms 31828 KB Output is correct
7 Correct 114 ms 28616 KB Output is correct
8 Correct 96 ms 25724 KB Output is correct
9 Correct 64 ms 18308 KB Output is correct
10 Correct 117 ms 36400 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -