Cod sursa(job #2098091)

Utilizator robx12lnLinca Robert robx12ln Data 2 ianuarie 2018 13:12:02
Problema Pachete Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
ifstream fin("pachete.in");
ofstream fout("pachete.out");
int Ox, Oy, N, X, Y, sol;
vector< pair<int,int> > v[4];
set<int> aux;
set<int>::iterator it;
inline int cadran( int X, int Y ){
    if( X >= 0 && Y >= 0 )
        return 0;
    if( X <= 0 && Y >= 0 )
        return 1;
    if( X <= 0 && Y <= 0 )
        return 2;
    if( X >= 0 && Y <= 0 )
        return 3;
}
void rotesc( int nr ){
    pair<int,int> P;
    if( nr == 1 ){
        for( int i = 0; i < v[nr].size(); i++ ){
            P = v[nr][i];
            v[nr][i].first = P.second;
            v[nr][i].second = -P.first;
        }
    }
    if( nr == 2 ){
        for( int i = 0; i < v[nr].size(); i++ ){
            P = v[nr][i];
            v[nr][i].first = -P.first;
            v[nr][i].second = -P.second;
        }
    }
    if( nr == 3 ){
        for( int i = 0; i < v[nr].size(); i++ ){
            P = v[nr][i];
            v[nr][i].first = -P.second;
            v[nr][i].second = P.first;
        }
    }
    return;
}
int solve( int nr ){
    if( v[nr].size() == 0 )
        return 0;
    sort( v[nr].begin(), v[nr].end() );
    aux.clear();
    aux.insert( v[nr][0].second );
    for( int i = 1; i < v[nr].size(); i++ ){
        it = aux.lower_bound( v[nr][i].second );
        if( it != aux.end() )
            aux.erase( it );
        aux.insert( v[nr][i].second );
    }
    return (int)aux.size();
}
int main(){
    fin >> N >> Ox >> Oy;
    for( int i = 1; i <= N; i++ ){
        fin >> X >> Y;
        X -= Ox; Y -= Oy;
        v[ cadran( X, Y ) ].push_back( make_pair( X, Y ) );
    }
    sol = 0;
    sol += solve( 0 );
    rotesc( 1 );
    sol += solve( 1 );
    rotesc( 2 );
    sol += solve( 2 );
    rotesc( 3 );
    sol += solve( 3 );
    fout << sol << "\n";
    return 0;
}