Cod sursa(job #2070494)

Utilizator robx12lnLinca Robert robx12ln Data 19 noiembrie 2017 17:05:34
Problema Overlap Scor 100
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];
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;
}