#include <iostream>
#include <cstring>
#include <array>
#include <vector>
using u32 = unsigned int;
#define hint( msg )
enum RESULT
{
win,
even,
lose,
result_count, hint( "sizer" )
};
struct TEAM_SCORE
{
int counts[ result_count ];
};
std::vector< TEAM_SCORE > results;
std::vector< TEAM_SCORE > suppose;
//----------------------------------------------------------------------------------------
std::vector< std::pair< int, int > > matches;
void build_matches( const int team_count )
{
matches.clear();
const int triangular_size = team_count * ( team_count - 1 ) / 2;
matches.reserve( triangular_size );
for( int a = 0; a < team_count - 1; ++a )
for( int b = a + 1; b < team_count; ++b )
matches.emplace_back( std::make_pair( a, b ) );
}
//----------------------------------------------------------------------------------------
bool possible;
void play_game1( u32 game_index );
inline void test_case1( const u32 game_index, const RESULT result_a, const RESULT result_b )
{
const u32 team_a = matches[ game_index ].first;
const u32 team_b = matches[ game_index ].second;
if( suppose[ team_a ].counts[ result_a ] + 1 <=
results[ team_a ].counts[ result_a ] &&
suppose[ team_b ].counts[ result_b ] + 1 <=
results[ team_b ].counts[ result_b ] )
{
suppose[ team_a ].counts[ result_a ]++;
suppose[ team_b ].counts[ result_b ]++;
play_game1( game_index + 1 );
suppose[ team_a ].counts[ result_a ]--;
suppose[ team_b ].counts[ result_b ]--;
}
}
void play_game1( u32 game_index )
{
if( game_index >= matches.size() )
{
possible = true;
return;
}
test_case1( game_index, win, lose );
if( possible ) return;
test_case1( game_index, lose, win );
if( possible ) return;
test_case1( game_index, even, even );
if( possible ) return;
}
//----------------------------------------------------------------------------------------
#include <setjmp.h>
jmp_buf env;
void play_game2( u32 game_index );
inline void test_case2( const u32 game_index, const RESULT result_a, const RESULT result_b )
{
const u32 team_a = matches[ game_index ].first;
const u32 team_b = matches[ game_index ].second;
if( suppose[ team_a ].counts[ result_a ] + 1 <=
results[ team_a ].counts[ result_a ] &&
suppose[ team_b ].counts[ result_b ] + 1 <=
results[ team_b ].counts[ result_b ] )
{
suppose[ team_a ].counts[ result_a ]++;
suppose[ team_b ].counts[ result_b ]++;
play_game2( game_index + 1 );
suppose[ team_a ].counts[ result_a ]--;
suppose[ team_b ].counts[ result_b ]--;
}
}
void play_game2( u32 game_index )
{
if( game_index >= matches.size() )
longjmp( env, 1 );
test_case2( game_index, win, lose );
test_case2( game_index, lose, win );
test_case2( game_index, even, even );
}
//----------------------------------------------------------------------------------------
using namespace std;
constexpr int team_count = 6;
constexpr int problem_count = 4;
array< array< TEAM_SCORE, team_count >, problem_count > inputs
{ {
{ { { 5, 0, 0 }, { 3, 0, 2 }, { 2, 0, 3 }, { 0, 0, 5 }, { 4, 0, 1 }, { 1, 0, 4 } } },
{ { { 4, 1, 0 }, { 3, 0, 2 }, { 4, 1, 0 }, { 1, 1, 3 }, { 0, 0, 5 }, { 1, 1, 3 } } },
{ { { 5, 0, 0 }, { 4, 0, 1 }, { 2, 2, 1 }, { 2, 0, 3 }, { 1, 0, 4 }, { 0, 0, 5 } } },
{ { { 5, 0, 0 }, { 3, 1, 1 }, { 2, 1, 2 }, { 2, 0, 3 }, { 0, 0, 5 }, { 1, 0, 4 } } },
} };
int main()
{
build_matches( team_count );
suppose.resize( team_count );
for( u32 i = 0; i < inputs.size(); ++i )
{
std::fill( suppose.begin(), suppose.end(), TEAM_SCORE{ 0, 0, 0 } );
results.assign( inputs[ i ].begin(), inputs[ i ].end() );
possible = false;
play_game1( 0 );
cout << possible << " ";
}
cout << endl;
for( u32 i = 0; i < inputs.size(); ++i )
{
std::fill( suppose.begin(), suppose.end(), TEAM_SCORE{ 0, 0, 0 } );
results.assign( inputs[ i ].begin(), inputs[ i ].end() );
int possible = setjmp( env );
if( !possible )
play_game2( 0 );
cout << possible << " ";
}
cout << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgICB1MzIgPSB1bnNpZ25lZCBpbnQ7CgojZGVmaW5lIGhpbnQoIG1zZyApCgplbnVtICAgIFJFU1VMVAp7CiAgICB3aW4sCiAgICBldmVuLAogICAgbG9zZSwKICAgIHJlc3VsdF9jb3VudCwgICBoaW50KCAic2l6ZXIiICkKfTsKCnN0cnVjdCAgVEVBTV9TQ09SRQp7CiAgICBpbnQgY291bnRzWyByZXN1bHRfY291bnQgXTsKfTsKCnN0ZDo6dmVjdG9yPCBURUFNX1NDT1JFID4gICByZXN1bHRzOwpzdGQ6OnZlY3RvcjwgVEVBTV9TQ09SRSA+ICAgc3VwcG9zZTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RkOjp2ZWN0b3I8IHN0ZDo6cGFpcjwgaW50LCBpbnQgPiA+ICAgIG1hdGNoZXM7Cgp2b2lkIGJ1aWxkX21hdGNoZXMoIGNvbnN0IGludCB0ZWFtX2NvdW50ICkKewogICAgbWF0Y2hlcy5jbGVhcigpOwoKICAgIGNvbnN0ICAgaW50IHRyaWFuZ3VsYXJfc2l6ZSA9IHRlYW1fY291bnQgKiAoIHRlYW1fY291bnQgLSAxICkgLyAyOwogICAgbWF0Y2hlcy5yZXNlcnZlKCB0cmlhbmd1bGFyX3NpemUgKTsKCiAgICBmb3IoIGludCBhID0gMDsgYSA8IHRlYW1fY291bnQgLSAxOyArK2EgKQogICAgICAgIGZvciggaW50IGIgPSBhICsgMTsgYiA8IHRlYW1fY291bnQ7ICsrYiApCiAgICAgICAgICAgIG1hdGNoZXMuZW1wbGFjZV9iYWNrKCBzdGQ6Om1ha2VfcGFpciggYSwgYiApICk7Cn0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpib29sIHBvc3NpYmxlOwoKdm9pZCBwbGF5X2dhbWUxKCB1MzIgZ2FtZV9pbmRleCApOwoKaW5saW5lIHZvaWQgdGVzdF9jYXNlMSggY29uc3QgdTMyIGdhbWVfaW5kZXgsIGNvbnN0IFJFU1VMVCByZXN1bHRfYSwgY29uc3QgUkVTVUxUIHJlc3VsdF9iICkKewogICAgY29uc3QgdTMyIHRlYW1fYSA9IG1hdGNoZXNbIGdhbWVfaW5kZXggXS5maXJzdDsKICAgIGNvbnN0IHUzMiB0ZWFtX2IgPSBtYXRjaGVzWyBnYW1lX2luZGV4IF0uc2Vjb25kOwoKICAgIGlmKCBzdXBwb3NlWyB0ZWFtX2EgXS5jb3VudHNbIHJlc3VsdF9hIF0gKyAxIDw9CiAgICAgICAgcmVzdWx0c1sgdGVhbV9hIF0uY291bnRzWyByZXN1bHRfYSBdICYmCgogICAgICAgIHN1cHBvc2VbIHRlYW1fYiBdLmNvdW50c1sgcmVzdWx0X2IgXSArIDEgPD0KICAgICAgICByZXN1bHRzWyB0ZWFtX2IgXS5jb3VudHNbIHJlc3VsdF9iIF0gKQogICAgewogICAgICAgIHN1cHBvc2VbIHRlYW1fYSBdLmNvdW50c1sgcmVzdWx0X2EgXSsrOwogICAgICAgIHN1cHBvc2VbIHRlYW1fYiBdLmNvdW50c1sgcmVzdWx0X2IgXSsrOwogICAgICAgIHBsYXlfZ2FtZTEoIGdhbWVfaW5kZXggKyAxICk7CiAgICAgICAgc3VwcG9zZVsgdGVhbV9hIF0uY291bnRzWyByZXN1bHRfYSBdLS07CiAgICAgICAgc3VwcG9zZVsgdGVhbV9iIF0uY291bnRzWyByZXN1bHRfYiBdLS07CiAgICB9Cn0KCnZvaWQgcGxheV9nYW1lMSggdTMyIGdhbWVfaW5kZXggKQp7CiAgICBpZiggZ2FtZV9pbmRleCA+PSBtYXRjaGVzLnNpemUoKSApCiAgICB7CiAgICAgICAgcG9zc2libGUgPSB0cnVlOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB0ZXN0X2Nhc2UxKCBnYW1lX2luZGV4LCB3aW4sIGxvc2UgKTsKICAgIGlmKCBwb3NzaWJsZSApIHJldHVybjsKCiAgICB0ZXN0X2Nhc2UxKCBnYW1lX2luZGV4LCBsb3NlLCB3aW4gKTsKICAgIGlmKCBwb3NzaWJsZSApIHJldHVybjsKCiAgICB0ZXN0X2Nhc2UxKCBnYW1lX2luZGV4LCBldmVuLCBldmVuICk7CiAgICBpZiggcG9zc2libGUgKSByZXR1cm47Cn0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojaW5jbHVkZSA8c2V0am1wLmg+CgpqbXBfYnVmIGVudjsKCnZvaWQgcGxheV9nYW1lMiggdTMyIGdhbWVfaW5kZXggKTsKCmlubGluZSB2b2lkIHRlc3RfY2FzZTIoIGNvbnN0IHUzMiBnYW1lX2luZGV4LCBjb25zdCBSRVNVTFQgcmVzdWx0X2EsIGNvbnN0IFJFU1VMVCByZXN1bHRfYiApCnsKICAgIGNvbnN0IHUzMiB0ZWFtX2EgPSBtYXRjaGVzWyBnYW1lX2luZGV4IF0uZmlyc3Q7CiAgICBjb25zdCB1MzIgdGVhbV9iID0gbWF0Y2hlc1sgZ2FtZV9pbmRleCBdLnNlY29uZDsKCiAgICBpZiggc3VwcG9zZVsgdGVhbV9hIF0uY291bnRzWyByZXN1bHRfYSBdICsgMSA8PQogICAgICAgIHJlc3VsdHNbIHRlYW1fYSBdLmNvdW50c1sgcmVzdWx0X2EgXSAmJgoKICAgICAgICBzdXBwb3NlWyB0ZWFtX2IgXS5jb3VudHNbIHJlc3VsdF9iIF0gKyAxIDw9CiAgICAgICAgcmVzdWx0c1sgdGVhbV9iIF0uY291bnRzWyByZXN1bHRfYiBdICkKICAgIHsKICAgICAgICBzdXBwb3NlWyB0ZWFtX2EgXS5jb3VudHNbIHJlc3VsdF9hIF0rKzsKICAgICAgICBzdXBwb3NlWyB0ZWFtX2IgXS5jb3VudHNbIHJlc3VsdF9iIF0rKzsKICAgICAgICBwbGF5X2dhbWUyKCBnYW1lX2luZGV4ICsgMSApOwogICAgICAgIHN1cHBvc2VbIHRlYW1fYSBdLmNvdW50c1sgcmVzdWx0X2EgXS0tOwogICAgICAgIHN1cHBvc2VbIHRlYW1fYiBdLmNvdW50c1sgcmVzdWx0X2IgXS0tOwogICAgfQp9Cgp2b2lkIHBsYXlfZ2FtZTIoIHUzMiBnYW1lX2luZGV4ICkKewogICAgaWYoIGdhbWVfaW5kZXggPj0gbWF0Y2hlcy5zaXplKCkgKQogICAgICAgIGxvbmdqbXAoIGVudiwgMSApOwoKICAgIHRlc3RfY2FzZTIoIGdhbWVfaW5kZXgsIHdpbiwgbG9zZSApOwogICAgdGVzdF9jYXNlMiggZ2FtZV9pbmRleCwgbG9zZSwgd2luICk7CiAgICB0ZXN0X2Nhc2UyKCBnYW1lX2luZGV4LCBldmVuLCBldmVuICk7Cn0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp1c2luZyAgIG5hbWVzcGFjZSAgIHN0ZDsKCmNvbnN0ZXhwciAgIGludCB0ZWFtX2NvdW50ICAgICAgPSA2Owpjb25zdGV4cHIgICBpbnQgcHJvYmxlbV9jb3VudCAgID0gNDsKCmFycmF5PCBhcnJheTwgVEVBTV9TQ09SRSwgdGVhbV9jb3VudCA+LCBwcm9ibGVtX2NvdW50ID4gaW5wdXRzCnsgewogICAgeyB7IHsgNSwgMCwgMCB9LCB7IDMsIDAsIDIgfSwgeyAyLCAwLCAzIH0sIHsgMCwgMCwgNSB9LCB7IDQsIDAsIDEgfSwgeyAxLCAwLCA0IH0gfSB9LAogICAgeyB7IHsgNCwgMSwgMCB9LCB7IDMsIDAsIDIgfSwgeyA0LCAxLCAwIH0sIHsgMSwgMSwgMyB9LCB7IDAsIDAsIDUgfSwgeyAxLCAxLCAzIH0gfSB9LAogICAgeyB7IHsgNSwgMCwgMCB9LCB7IDQsIDAsIDEgfSwgeyAyLCAyLCAxIH0sIHsgMiwgMCwgMyB9LCB7IDEsIDAsIDQgfSwgeyAwLCAwLCA1IH0gfSB9LAogICAgeyB7IHsgNSwgMCwgMCB9LCB7IDMsIDEsIDEgfSwgeyAyLCAxLCAyIH0sIHsgMiwgMCwgMyB9LCB7IDAsIDAsIDUgfSwgeyAxLCAwLCA0IH0gfSB9LAp9IH07CgppbnQgbWFpbigpCnsKCWJ1aWxkX21hdGNoZXMoIHRlYW1fY291bnQgKTsKCXN1cHBvc2UucmVzaXplKCB0ZWFtX2NvdW50ICk7CgkKICAgIGZvciggdTMyIGkgPSAwOyBpIDwgaW5wdXRzLnNpemUoKTsgKytpICkKICAgIHsKICAgICAgICBzdGQ6OmZpbGwoIHN1cHBvc2UuYmVnaW4oKSwgc3VwcG9zZS5lbmQoKSwgVEVBTV9TQ09SRXsgMCwgMCwgMCB9ICk7CiAgICAgICAgcmVzdWx0cy5hc3NpZ24oIGlucHV0c1sgaSBdLmJlZ2luKCksIGlucHV0c1sgaSBdLmVuZCgpICk7CiAgICAgICAgcG9zc2libGUgPSBmYWxzZTsKICAgICAgICBwbGF5X2dhbWUxKCAwICk7CiAgICAgICAgY291dCA8PCBwb3NzaWJsZSA8PCAiICI7CiAgICB9CiAgICBjb3V0IDw8IGVuZGw7CgogICAgZm9yKCB1MzIgaSA9IDA7IGkgPCBpbnB1dHMuc2l6ZSgpOyArK2kgKQogICAgewogICAgICAgIHN0ZDo6ZmlsbCggc3VwcG9zZS5iZWdpbigpLCBzdXBwb3NlLmVuZCgpLCBURUFNX1NDT1JFeyAwLCAwLCAwIH0gKTsKICAgICAgICByZXN1bHRzLmFzc2lnbiggaW5wdXRzWyBpIF0uYmVnaW4oKSwgaW5wdXRzWyBpIF0uZW5kKCkgKTsKICAgICAgICBpbnQgcG9zc2libGUgPSBzZXRqbXAoIGVudiApOwogICAgICAgIGlmKCAhcG9zc2libGUgKQogICAgICAgICAgICBwbGF5X2dhbWUyKCAwICk7CiAgICAgICAgY291dCA8PCBwb3NzaWJsZSA8PCAiICI7CiAgICB9CiAgICBjb3V0IDw8IGVuZGw7CiAgICAKCXJldHVybiAgMDsKfQ==