Submission #1235890

#TimeUsernameProblemLanguageResultExecution timeMemory
1235890altern23Poklon (COCI17_poklon7)C++20
120 / 120
402 ms173400 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
#define pii pair<ll, ll>
#define fi first
#define sec second
#define ld long double

const int MAXN = 1e6;
const ll INF = 1e18;
const int MOD = 1e9 + 7;

ll len[MAXN + 5], lf[MAXN + 5], rg[MAXN + 5], val[MAXN + 5];

string conv(ll idx){
	string ans = "";
	for(;idx > 0;){
		ans.push_back((idx % 2) + '0');
		idx /= 2;
	}
	reverse(ans.begin(), ans.end());
	return ans;
}

void dfs(ll idx){
	pii kiri, kanan;
	if(lf[idx] > 0){
		dfs(lf[idx]);
		kiri = {val[lf[idx]], len[lf[idx]]};
	}
	else kiri = {abs(lf[idx]), 0};
	if(rg[idx] > 0){
		dfs(rg[idx]);
		kanan = {val[rg[idx]], len[rg[idx]]};
	}
	else kanan = {abs(rg[idx]), 0};

	string L = conv(kiri.fi), R = conv(kanan.fi);
	bool use_L = 0, use_R = 0;
	if(L.size() + kiri.sec > R.size() + kanan.sec) use_L = 1;
	else if(L.size() + kiri.sec < R.size() + kanan.sec) use_R = 1;
	else{
		bool cek = 0;
		for(int i = 0; i < (int)max(R.size(), L.size()); i++){
			if(i >= (int)L.size()) break;
			if(i >= (int)R.size()){
				cek = 1;
				break;
			}
			if(L[i] > R[i]){
				cek = 1;
				break;
			}
			if(L[i] < R[i]){
				break;
			}
		}
		use_L = cek, use_R = (!cek);
	}
	
	if(use_L) val[idx] = kiri.fi, len[idx] = kiri.sec;
	if(use_R) val[idx] = kanan.fi, len[idx] = kanan.sec;
	len[idx]++;	
}

int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int tc = 1;	
	// cin >> tc;
	for(;tc--;){
		ll N; cin >> N;
		for(int i = 1; i <= N; i++){
			cin >> lf[i] >> rg[i];
		}
		
		dfs(1);
		cout << conv(val[1]);
		for(int i = 1; i <= len[1]; i++) cout << 0;
		cout << "\n";
	}	
}

/*

*/
#Verdict Execution timeMemoryGrader output
Fetching results...