Submission #357894

#TimeUsernameProblemLanguageResultExecution timeMemory
357894CaroLindaKoala Game (APIO17_koala)C++14
87 / 100
86 ms492 KiB
#include "koala.h"
#include <bits/stdc++.h>

#define all(x) x.begin(),x.end()
#define ll long long
#define sz(x) (int)(x.size() )

using namespace std ;

int b[100] , r[100] ;

void clean() { for(int i = 0 ; i < 100 ; i++ ) b[i] = 0 ; }

int minValue(int N, int W) 
{
	clean() ;

	b[0] = 1 ;
	playRound(b, r) ;

	if(r[0] < 2 ) return 0 ;

	for(int i = 1 ; i< 100 ; i++ )
		if( !r[i] ) return i ;
}

int maxValue(int N, int W) 
{

	vector<int> v(N) ; iota(all(v),0) ;	
	vector<int> aux ;

	while( sz(v) > 1 )
	{
		clean() ;
		
		for(auto e : v ) b[e] = 100/sz(v) ;
	
		playRound(b, r) ;

		aux.clear() ;
		for(auto e : v ) 
			if( r[e] > b[e] ) aux.push_back(e) ;

		swap(v,aux) ;
	}

	return v[0] ;

}

int greaterValue(int N, int W) 
{
	clean() ;
	b[0] = b[1] = 5 ;

	playRound(b,r) ;

	if( (b[0] < r[0] ) != (b[1] < r[1] ) ) return (b[1] < r[1] ) ;

	if( b[0] < r[0] )
	{
		b[0] = b[1] = 7 ;
		playRound(b,r) ;

		if( (b[0] < r[0] ) != (b[1] < r[1] ) ) return (b[1] < r[1] ) ;

		b[0] = b[1] = 8 ;
		playRound(b,r) ;

		return (b[1] < r[1] ) ;

	}
	else
	{
		b[0] = b[1] = 2 ;
		playRound(b,r) ;
		
		if( (b[0] < r[0] ) != (b[1] < r[1] ) ) return (b[1] < r[1] ) ;
		if(b[0] < r[0] )
		{
			b[0] = b[1] = 3 ;
			playRound(b,r) ;
			return (b[1] < r[1] ) ;
		}
		else
		{
			b[0] = b[1] = 1 ;
			playRound(b,r) ;
			return (b[1] < r[1] ) ;
		}

	}

}

bool isLarger(int x , int y, int t = 100  )
{
	clean() ;

	b[x] = b[y] = t ;
	playRound(b,r) ;

	return (b[x] < r[x] ) ;
}

vector<int> solve(vector<int> idx , int x )
{
	vector<int> v = {idx[0], idx[1] } ;
	if( isLarger(idx[0], idx[1], x ) ) swap(v[0], v[1] );	

	for(int i = 2 ; i < sz(idx) ; i++ )
	{
		int l = 0 , r = sz(v)-1 , mid , best = -1 ;
		while( l <= r )
		{
			mid = (l+r)>>1 ;
			if( isLarger(idx[i], v[mid],x  ) )
			{
				best = mid ;
				l = mid+1 ;
			}
			else r = mid-1 ;
		}			

		vector<int> newV ;
		if( best == -1 ) newV.push_back(idx[i]) ;
			
		for(int j = 0 ; j < sz(v) ; j++ )
		{
			newV.push_back(v[j] ) ;
			if( j == best ) newV.push_back( idx[i] ) ;
		}

		swap(newV, v) ;

	}

	return v ;

}

void allValues(int N, int W, int *P) 
{

    if (W == 2*N) 
    {
    	vector<int> idx(N) ; iota(all(idx),0) ;
		vector<int> v = solve(idx, 100 ) ;

		for(int i = 0 ; i < N ; i++ ) P[ v[i] ] = i+1 ;

    } 
    else 
    {

		for(int i = 0 ; i < N ; i++ ) P[i] = 0 ;
		for(int i = 0 ; i < N ; i++ ) b[i] = 1 ;

		playRound(b,r) ;
	
		for(int i = 0 ; i < N ; i++ ) 
			b[i] = (b[i] < r[i] ) ? 2 : 0 ;

		playRound(b,r) ;

		vector< vector<int> > quarters(4,vector<int>() ) ;

		for(int i = 0 ; i< N ; i++ )
		{
			if( b[i] == 2 )
			{
				if( b[i] < r[i] ) quarters[3].push_back(i) ;
				else quarters[2].push_back(i) ;
			}
			else
			{
				if( b[i] < r[i] ) quarters[1].push_back(i); 
				else quarters[0].push_back(i) ;
			}
		}

		for(int i = 0 ; i < 4 ; i++ ) random_shuffle(all(quarters[i] ) ) ;

		clean() ;

		for(int i = 0 ; i < sz(quarters[3] ) ; i++ )
		{
			b[ quarters[3][i] ] = 1 ;
			
			playRound(b,r) ;

			for(int j = 0 ; j < N ; j++ )
				if( P[j] == 0 && (b[j] >= r[j] ) ) P[j] = i+1 ;
		}

		vector<int> beg = {26,51,76} ;

		for(int i = 1 , x = 6 ; i < 4 ; i++, x++ )
		{
			
			vector<int> t = solve(quarters[i], x ) ;

			for(int j = beg[i-1] , k = 0 ; k < sz(t) ; k++ , j++ )
				P[ t[k] ] = j ;

		}

    }       	
}

Compilation message (stderr)

koala.cpp: In function 'int minValue(int, int)':
koala.cpp:25:1: warning: control reaches end of non-void function [-Wreturn-type]
   25 | }
      | ^
#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...