Pagini recente » Cod sursa (job #1734456) | Cod sursa (job #2591564) | Cod sursa (job #1678576) | Cod sursa (job #2822497) | Cod sursa (job #2070494)
#include<fstream>
#include<algorithm>
#include<cstring>
using namespace std;
ifstream fin("overlap.in");
ofstream fout("overlap.out");
int n, To[805], ok, f[805], Gin[805], sol[805];
pair<int,int> v[805], sir[805];
pair<int,int> roting( pair<int,int> P, int k ){
pair<int,int> new_P = P;
if( k == 1 ){
new_P.first = -P.second;
new_P.second = P.first;
}
if( k == 2 ){
new_P.first = -P.first;
new_P.second = -P.second;
}
if( k == 3 ){
new_P.first = P.second;
new_P.second = -P.first;
}
return new_P;
}
inline int get_pos( pair<int,int> P ){
int st = 1;
int dr = n;
while( st <= dr ){
int mid = ( st + dr ) >> 1;
if( v[mid].first == P.first ){
if( v[mid].second == P.second )
return mid;
else{
if( v[mid].second < P.second )
st = mid + 1;
else
dr = mid - 1;
}
}else{
if( v[mid].first < P.first )
st = mid + 1;
else
dr = mid - 1;
}
}
return 0;
}
int dfs( int nod ){
int lg = 0;
while( nod != 0 && f[nod] == 0 ){
lg++;
f[nod] = 1;
nod = To[nod];
}
return lg;
}
void mark( int nod, int c ){
while( nod != 0 && f[nod] == 0 ){
f[nod] = c + 1;
nod = To[nod];
c = !c;
}
}
int main(){
fin >> n;
for( int i = 1; i <= n; i++ ){
fin >> v[i].first >> v[i].second;
sir[i] = v[i];
}
sort( v + 1, v + n + 1 );
for( int k = 0; k <= 3; k++ ){
pair<int, int> P0 = roting( v[1], k );
for( int i = 2; i <= n; i++ ){
int shift_x = v[i].first - P0.first;
int shift_y = v[i].second - P0.second;
memset( To, 0, sizeof(To) );
memset( f, 0, sizeof(f) );
memset( Gin, 0, sizeof(Gin) );
To[1] = i;
Gin[ To[1] ] = 1;
for( int j = 2; j <= n; j++ ){
pair<int,int> P = roting( v[j], k );
P.first += shift_x;
P.second += shift_y;
To[j] = get_pos( P );
Gin[ To[j] ] = 1;
}
ok = 1;
f[0] = 1;
for( int j = 1; j <= n; j++ ){
if( Gin[j] == 0 && f[j] == 0 ){
if( dfs( j ) % 2 == 1 ){
ok = 0;
break;
}
}
}
if( ok == 0 )
continue;
for( int j = 1; j <= n; j++ ){
if( f[j] == 0 ){
if( dfs( j ) % 2 == 1 ){
ok = 0;
break;
}
}
}
if( ok == 0 )
continue;
memset( f, 0, sizeof(f) );
for( int j = 1; j <= n; j++ ){
if( f[j] == 0 && Gin[j] == 0 )
mark( j, 0 );
}
for( int j = 1; j <= n; j++ ){
if( f[j] == 0 )
mark( j, 0 );
}
for( int j = 1; j <= n; j++ ){
for( int p = 1; p <= n; p++ )
if( v[j] == sir[p] )
sol[p] = f[j];
}
for( int j = 1; j <= n; j++ ){
fout << sol[j] << "\n";
}
return 0;
}
}
return 0;
}