/ SeriousOJ /

Record Detail

Memory Exceeded


  
# Status Time Cost Memory Cost
#1 Accepted 5ms 5.02 MiB
#2 Accepted 5ms 5.066 MiB
#3 Wrong Answer 5ms 5.121 MiB
#4 Wrong Answer 7ms 5.246 MiB
#5 Wrong Answer 31ms 6.164 MiB
#6 Wrong Answer 53ms 6.27 MiB
#7 Wrong Answer 38ms 6.418 MiB
#8 Memory Exceeded ≥520ms ≥256.016 MiB
#9 Wrong Answer 52ms 5.27 MiB
#10 Wrong Answer 63ms 6.207 MiB
#11 Wrong Answer 45ms 6.52 MiB
#12 Wrong Answer 51ms 6.273 MiB
#13 Wrong Answer 23ms 6.355 MiB
#14 Wrong Answer 69ms 6.52 MiB
#15 Wrong Answer 35ms 5.184 MiB
#16 Wrong Answer 21ms 6.375 MiB
#17 Wrong Answer 20ms 6.215 MiB
#18 Wrong Answer 26ms 6.359 MiB
#19 Accepted 74ms 14.273 MiB
#20 Accepted 82ms 14.219 MiB
#21 Accepted 69ms 14.254 MiB
#22 Accepted 86ms 19.352 MiB
#23 Wrong Answer 135ms 13.562 MiB
#24 Wrong Answer 142ms 13.52 MiB
#25 Wrong Answer 86ms 13.52 MiB
#26 Accepted 9ms 5.562 MiB

Code

// I AM A MUSLIM

#include "bits/stdc++.h"

#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#define fastIO std::ios::sync_with_stdio(0);std::cin.tie(0)
#define ll long long int
#define flush fflush(stdout)
#define bl printf("\n")
#define yn(a, b) printf("%s\n", a >= b ? "Yes":"No")
// #define int ll

using pii = std::pair<int,int>;

const int MOD = 1000000007;
// const int MOD = 998244353;
const int mxN = 200100;

int N, a[mxN];
std::vector<int> g[mxN];
int dis[mxN], par[mxN];

void dfs(int u, int p, int d) {
    if (a[u]) dis[u] = d;
    for (auto &v : g[u]) {
        if (v == p) continue;
        dfs(v, u, d+1);
    }
}

void dfs_par(int u, int p, int d) {
    if (a[u]) dis[u] = d;
    for (auto &v : g[u]) {
        if (v == p) continue;
        par[v] = u;
        dfs_par(v, u, d+1);
    }
}

ll dfs_calc(int u, int p, int d) {
    ll cur = 0;
    if (a[u]) cur += 2*d;
    for (auto &v : g[u]) {
        if (v == p) continue;
        cur += dfs_calc(v, u, d+1);
    }
    return cur;
}

signed main() {
    // fastIO;
    int testCases=1;
    scanf("%d",&testCases);
    // std::cin>>testCases;
    
    for (int TC = 1; TC <= testCases; TC++) {
        scanf("%d",&N);
        for (int i = 1; i <= N; i++) {
            scanf("%d",&a[i]);
        }
        for (int i = 0, u,v; i < N-1; i++) {
            scanf("%d%d",&u,&v);
            g[u].push_back(v);
            g[v].push_back(u);
        }
        
        for (int i = 1; i <= N; i++) {
            dis[i] = -1;
        }
        dfs(1, -1, 0);
        int L = -1, val = 0;
        for (int i = 1; i <= N; i++) {
            if (dis[i] != -1 && dis[i] > val) {
                val = dis[i];
                L = i;
            }
        }
        
        if (L == -1) {
            puts("0");
            continue;
        }
        for (int i = 1; i <= N; i++) {
            dis[i] = -1;
        }
        par[L] = -1;
        dfs_par(L, -1, 0);
        int R = -1; val = -1;
        for (int i = 1; i <= N; i++) {
            if (dis[i] != -1 && dis[i] > val) {
                val = dis[i];
                R = i;
            }
        }
        
        ll ans = 0;
        assert(R != -1);
        int cur = R;
        std::vector<int> path;
        while (cur != -1) {
            path.push_back(cur);
            cur = par[cur];
        } reverse(path.begin(), path.end());
        // puts("HERE");
        for (int i = 1; i < (int)path.size()-1; i++) {
            int u = path[i];
            for (auto &v : g[u]) {
                if (v == path[i-1]) continue;
                if (v == path[i+1]) continue;
                ans += dfs_calc(v, u, 1);
            }
        }
        
        printf("%lld\n", ans+val);
        for (int i = 1; i <= N; i++) g[i].clear();
        
    }
    
    return 0;
}

/*

*/

Information

Submit By
Type
Submission
Problem
P1078 Apple on Tree
Language
C++20 (G++ 13.2.0)
Submit At
2024-08-16 17:55:21
Judged At
2024-08-16 17:55:21
Judged By
Score
34
Total Time
≥520ms
Peak Memory
≥256.016 MiB