Cod sursa(job #2070483)

Utilizator robx12lnLinca Robert robx12ln Data 19 noiembrie 2017 16:52:41
Problema Overlap Scor 24
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.57 kb
#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], Gout[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, pair<int,int> a[] ){
    int st = 1;
    int dr = n;
    while( st <= dr ){
        int mid = ( st + dr ) >> 1;
        if( a[mid].first == P.first ){
            if( a[mid].second == P.second )
                return mid;
            else{
                if( a[mid].second < P.second )
                    st = mid + 1;
                else
                    dr = mid - 1;
            }
        }else{
            if( a[mid].first < P.first )
                st = mid + 1;
            else
                dr = mid - 1;
        }
    }
    return -1;
}
int dfs( int nod ){
   int lg = 0;
   while( nod != -1 && f[nod] == 0 ){
        lg++;
        f[nod] = 1;
        nod = To[nod];
   }
   return lg;
}
void mark( int nod, int c ){
    f[nod] = c + 1;
    if( To[nod] == -1 )
        return;
    mark( To[nod], !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) );
            memset( Gout, 0, sizeof(Gout) );
            To[1] = i;
            Gin[ To[1] ] = 1;
            Gout[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, v );
                if( To[j] != -1 ){
                    Gin[ To[j] ] = 1;
                    Gout[j] = 1;
                }
            }
            ok = 1;
            for( int j = 1; j <= n; j++ ){
                if( Gin[j] == 0 && Gout[j] == 0 ){
                    ok = 0;
                    break;
                }
            }
            if( ok == 0 )
                continue;
            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;
            memset( f, 0, sizeof(f) );
            for( int j = 1; j <= n; j++ ){
                if( f[j] != 0 || Gin[j] == 1 )
                    continue;
                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;
}