Submission #1350910

#TimeUsernameProblemLanguageResultExecution timeMemory
1350910Jawad_Akbar_JJSvjetlo (COCI20_svjetlo)C++20
0 / 110
159 ms48732 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 1<<19;
vector<int> nei[N];
string s, ss;

void dfs(int u, int p){
	if (ss.size() > 0 or s[u - 1] == '0')
		ss += s[u-1];
	for (int i : nei[u])
		if (i != p)
			dfs(i, u);
}

int solve(){
	long long l = 0, r = ss.size() - 1, ans = r + 1;
	while (l < r){
		l++;
		while (l < r and ss[l] == '0')
			l++;
		if (l >= r)
			break;
		ans += r - l;
		r--;
		while (l < r and ss[r] == '1')
			r--;
		if (l >= r)
			break;
		ans += r - l;
	}
	return ans;
}

int main(){
	int n;
	cin>>n>>s;

	for (int i=1;i<n;i++){
		int a, b;
		cin>>a>>b;
		nei[a].push_back(b);
		nei[b].push_back(a);
	}

	for (int i=1;i<=n and ss.size() == 0;i++){
		if (nei[i].size() == 1)
			dfs(i, i);
	}

	while (ss.back() == '1')
		ss.pop_back();

	int ans = solve();
	reverse(begin(ss), end(ss));
	ans = min(ans, solve());

	cout<<ans<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...