Cod sursa(job #2098070)

Utilizator robx12lnLinca Robert robx12ln Data 2 ianuarie 2018 12:28:32
Problema Pachete Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 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;
}
inline void rotesc_dr( int unghi, int nr ){
    int sin, cos;
    if( unghi == 90 )
        sin = 1, cos = 0;
    if( unghi == 180 )
        sin = 0, cos = -1;
    if( unghi == 270 )
        sin = -1, cos = 0;
    for( int i = 0; i < v[nr].size(); i++ ){
        pair<int,int> P( v[nr][i].first * cos - v[nr][i].second * sin, v[nr][i].first * sin + v[nr][i].second * cos );
        v[nr][i] = P;
    }
    return;
}
inline 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_dr( 90, 1 );
    sol += solve( 1 );
    rotesc_dr( 180, 2 );
    sol += solve( 2 );
    rotesc_dr( 270, 3 );
    sol += solve( 3 );
    fout << sol << "\n";
    return 0;
}