Submission #152380

#TimeUsernameProblemLanguageResultExecution timeMemory
152380Breno_XDPoklon (COCI17_poklon7)C++14
120 / 120
386 ms72660 KiB
#include <bits/stdc++.h> using namespace std; #define x first #define y second const int MAXN = 1000010; int n, aans, bans; int nivel[MAXN]; queue<pair<int,int> > fila; struct nodes{ int l,r; }; nodes node[MAXN]; void dfs(int f, int p){ // cout << "Demonstracao: " << f << " " << p << endl; nivel[f] = nivel[p] + 1; if(node[f].r < 0) fila.push(make_pair(abs(node[f].r) , nivel[f]+1)); else dfs(node[f].r, f); if(node[f].l < 0) fila.push(make_pair(abs(node[f].l) , nivel[f]+1)); else dfs(node[f].l, f); } int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin >> n; for(int i=1; i<=n; i++) cin >> node[i].l >> node[i].r; nivel[0] = -1; dfs(1,0); while(!fila.empty()){ pair<int,int> atual = fila.front(); fila.pop(); //Vamos compara ans e atual.x // cout << "Atual: " << atual.x << " " << atual.y << endl; // cout << "Ans: " << aans << " " << bans << endl; //Primeiro verificamos o último bit int tam = 32-__builtin_clz(atual.x) + atual.y; int tamans = 32-__builtin_clz(aans) + bans; if(tamans != tam){ if(tamans < tam){ // cout << "Atualizei tamdiff\n"; aans = atual.x; bans = atual.y; } }else{ tam = 31-__builtin_clz(atual.x); tamans = 31-__builtin_clz(aans); int size = min(tam, tamans); for(int i=size; i>=0; i--){ // cout << "i: " << i << endl; // cout << "Tam: " << tam << " tamans: " << tamans << endl; bool ok = (atual.x&(1<<tam)); bool okans = (aans&(1<<tamans)); if(ok && !okans){ //cout << "Atualizei tamiguais\n"; aans = atual.x; bans = atual.y; break; } if(!ok && okans) break; tam--; tamans--; } } } bool verifica = false; for(int i=30; i>=0; i--){ if((aans&(1<<i))) verifica = true; if(!verifica) continue; bool bit = (aans&(1<<i)); cout << bit; } for(int i=1; i<=bans; i++){ cout << 0; } cout << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...