Submission #98794

#TimeUsernameProblemLanguageResultExecution timeMemory
98794thiago4532Poklon (COCI17_poklon7)C++17
48 / 120
405 ms74840 KiB
#include <bits/stdc++.h> #define left _left #define right _right using namespace std; typedef long long ll; const int maxn = 1e6 + 10; ll left[maxn], right[maxn]; ll val[maxn]; int nivel[maxn]; int n; vector<int> teste[maxn]; void dfs(int u){ if(left[u] > 0) nivel[left[u]] = nivel[u] + 1, dfs(left[u]); if(right[u] > 0) nivel[right[u]] = nivel[u] + 1, dfs(right[u]); } int32_t main(){ ios::sync_with_stdio(false), cin.tie(0); cin >> n; for(int i=1;i<=n;i++){ int a, b; cin >> a >> b; left[i] = a; right[i] = b; } nivel[1] = 1; dfs(1); vector< pair<int, int> > v; for(int i=1;i<=n;i++) v.push_back({nivel[i], i}); sort(v.begin(), v.end()); reverse(v.begin(), v.end()); for(int i=0;i<(int)v.size();i++){ int u = v[i].second; if(left[u] > 0 && right[u] > 0){ val[left[u]] = max(val[left[u]], val[right[u]]); val[right[u]] = max(val[left[u]], val[right[u]]); val[u] = val[left[u]] + val[right[u]]; }else if(left[u] > 0 || right[u] > 0){ if(left[u] < 0) swap(left[u], right[u]); if(-right[u] <= val[left[u]]) right[u] = -val[left[u]]; else{ val[left[u]] = -right[u]; if(val[left[u]] % 2 != 0) val[left[u]]++, right[u]--; } val[u] = val[left[u]] - right[u]; }else{ left[u] = min(left[u], right[u]); right[u] = min(left[u], right[u]); val[u] = -(left[u] + right[u]); } } string str; while(val[1]){ str += '0' + (val[1]%2); val[1] /= 2; } reverse(str.begin(), str.end()); cout << str << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...