/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 9ms 9.52 MiB
#2 Accepted 9ms 9.723 MiB
#3 Accepted 10ms 9.52 MiB
#4 Accepted 14ms 9.867 MiB
#5 Accepted 59ms 14.496 MiB
#6 Accepted 129ms 14.684 MiB
#7 Accepted 66ms 14.562 MiB
#8 Accepted 44ms 9.758 MiB
#9 Accepted 120ms 10.238 MiB
#10 Accepted 149ms 14.656 MiB
#11 Accepted 87ms 14.926 MiB
#12 Accepted 98ms 14.629 MiB
#13 Accepted 46ms 15.18 MiB
#14 Accepted 141ms 14.934 MiB
#15 Accepted 63ms 10.52 MiB
#16 Accepted 39ms 14.777 MiB
#17 Accepted 35ms 14.77 MiB
#18 Accepted 35ms 14.602 MiB
#19 Accepted 348ms 43.352 MiB
#20 Accepted 307ms 43.34 MiB
#21 Accepted 219ms 43.352 MiB
#22 Accepted 152ms 48.914 MiB
#23 Accepted 290ms 43.348 MiB
#24 Accepted 335ms 43.348 MiB
#25 Accepted 192ms 43.355 MiB
#26 Accepted 16ms 11.52 MiB

Code

// #pragma GCC optimize("O3,unroll-loops,Ofast")
// #pragma GCC target("avx2")
#include<bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
#define int long long
#define endl '\n'

using namespace std;
using pii = pair<int, int>;
using tup = tuple<int, int, int>;

// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
// template <class T> using ordered_set = tree<T, null_type,
//                          less<T>, rb_tree_tag, tree_order_statistics_node_update>;

const int inf = (1e15)+5;
const int mod = 1000000007;
const double eps = 1e-6;
const int N = 200005;

void preprocess() {}

int a[N];
set<int> e[N];

int dist[N];

void dfs(int u, int p, int d) {
	dist[u] = d;
	for(int v : e[u]) if(v != p) dfs(v, u, d+1);
}

int diameter(int root, int n) {
	for(int i=0; i<=n; i++) dist[i] = inf;
	dfs(root, -1, 0);
	int far = root;
	for(int i=1; i<=n; i++) if(dist[i] != inf and dist[i] > dist[far]) far = i;
	dfs(far, -1, 0);
	int diam = 0;
	for(int i=1; i<=n; i++) if(dist[i] != inf) diam = max(diam, dist[i]);
	return diam;
}

void solve(int tc) {
	int n;
	cin >> n;

	for(int i=0; i<=n; i++) e[i].clear();

	int on = 0;
	for(int i=1; i<=n; i++) {
		cin >> a[i];
		if(a[i]) on = i;
	}

	set<pii> st;
	for(int i=1; i<n; i++) {
		int u, v;
		cin >> u >> v;
		e[u].insert(v);
		e[v].insert(u);
	}

	if(on == 0) {
		cout << 0 << endl;
		return;
	}

	int edgecnt = n - 1;
	for(int i=1; i<=n; i++)
		st.insert({e[i].size(), i});

	while(st.size() and st.begin()->first == 1) {
		auto [cnt, u] = *st.begin();
		set<int> edges = e[u];
		
		if(a[u]) {
			st.erase({cnt, u});
			continue;
		}
		for(int v : edges) {
			st.erase({e[v].size(), v});
			e[v].erase(u);
			e[u].erase(v);
			st.insert({e[v].size(), v});
			edgecnt--;
		}
		st.erase({cnt, u});
	}

	// for(int i=1; i<=n; i++) {
	// 	cout << i << ' ' << a[i] << ": ";
	// 	for(int j : e[i]) cout << j << ' ';
	// 	cout << endl;
	// }
	int ans = edgecnt * 2 - diameter(on, n);
	cout << ans << endl;
}
    
int32_t main() {
    cin.tie(NULL)->sync_with_stdio(false);
    cout.precision(10);

    preprocess();

    int T = 1;
    cin >> T;

    for (int i = 1; i <= T; i++) {
        solve(i);
    }

    return 0;
}

Information

Submit By
Type
Submission
Problem
P1078 Apple on Tree
Contest
Bangladesh 2.0
Language
C++20 (G++ 13.2.0)
Submit At
2024-08-16 16:18:10
Judged At
2024-08-16 16:18:10
Judged By
Score
100
Total Time
348ms
Peak Memory
48.914 MiB