Submission #205748

#TimeUsernameProblemLanguageResultExecution timeMemory
205748CaroLindaSwap (BOI16_swap)C++14
100 / 100
953 ms74232 KiB
#include <bits/stdc++.h>
 
#define debug 
 
const int MAXN = 2e5+10 ;
const int LOG = 30 ;
 
using namespace std ;
 
int N ;
int A[MAXN] ;
int tab[MAXN][LOG] ;
int dp[MAXN][LOG*2] ;
 
char c ;
inline void read(int &num)
{
	num = 0 ; 
	c = getchar() ;
	for(; (c>47 && c < 58) ; c=getchar() )
		num = num*10 + c-48 ;
}
 
inline void fill_tab()
{
 
	for(int i = 1 ; i <= N; i++ )
	{
 
		int anc = i , idx = 0 ;
 
		while( anc )
		{
 
			tab[i][idx] = anc ;
			if( anc<<1 <= N ) tab[i][idx+20] = anc<<1 ;
			anc >>= 1 ;
			idx ++ ;
 
		}
 
	}
 
}
 
int calc_dp(int sub, int anc)
{

	if(sub > N/2 ) return sub ;
 
	int add ;
	int val = A[tab[sub][anc]] ;
 
	if( sub*2 > N ) return add = sub ;
	if( sub*2+1 > N ) return add = ( A[sub*2] < val ) ? sub*2 : sub ;
 
 
 
	if( val < min(A[sub*2], A[sub*2+1]) ) return add = sub ;
	if( A[sub*2] < min(val, A[sub*2+1]) ) return add = calc_dp( sub*2, anc+1 ) ;
 
	int a = val ;
	int b = A[sub*2] ;
	int c = A[sub*2+1] ;
	int val_esq, val_dir ;
 
	if( a < b )
	{
 
		val_esq = calc_dp( sub*2, anc+1 ) ;
		val_dir = calc_dp( sub*2+1, anc+1 ) ;
 
		return add = min( val_esq, val_dir ) ;
 
	}
 
	val_esq = calc_dp( sub*2, 0 ) ;
	val_dir = calc_dp( sub*2+1, 21 ) ;
 
	return add = ( val_esq < val_dir ) ? calc_dp( sub*2+1, anc+1 ) : calc_dp( sub*2, anc+1 ) ;
 
}
 
int main()
{
	read(N) ;
	for(int i = 1 ; i <= N ; i++ ) read(A[i]) ;
 
 
	fill_tab() ;
	memset(dp , -1, sizeof dp ) ;
 
	for(int i = 1 ; i <= N/2 ; i++ )
	{
 
		if( i*2 + 1 > N )
		{
 
			if( i*2 > N || A[i] < A[i*2] ) continue ;
 
			swap( A[i] , A[i*2] ) ;
 
			continue ;
 
		}
 
		//Case 1
		if( A[i] < min( A[i*2] , A[i*2+1] ) ) continue ;
 
		//Case 2
		if( A[i*2] < min( A[i] , A[i*2+1] ) )
		{
			swap( A[i] , A[i*2] ) ;
			continue ;
		}
 
		//Case 3 -> A[i*2+1] < min(A[i] , A[i*2])
		int a = A[i] ;
		int b = A[i*2] ;
		int c = A[i*2+1] ;
		int val_esq, val_dir ;
 
		if( a < b )
		{
 
			val_esq = calc_dp( i*2 , 1 ) ;
			val_dir = calc_dp( i*2+1, 1 ) ;
 
			if( val_esq > val_dir )
				swap(a,b) ;
 
			A[i*2] = a ;
			A[i*2+1] = b ;
 
 
		}
 
		else if( b < a )
		{
 
			val_esq = calc_dp( i*2 , 0 ) ;
			val_dir = calc_dp( i*2+1, 21 ) ;
 
			if( val_esq > val_dir )
				swap(a,b) ;
 
			A[i*2] = b ;
			A[i*2+1] = a;
 
		}
 
		A[i] = c ;
 
	}
 
	for(int i = 1 ; i <= N ; i++  ) printf("%d " , A[i] ) ;
	printf("\n") ;	
 
}

Compilation message (stderr)

swap.cpp: In function 'int calc_dp(int, int)':
swap.cpp:64:6: warning: unused variable 'c' [-Wunused-variable]
  int c = A[sub*2+1] ;
      ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...