Pagini recente » Cod sursa (job #2703636) | Cod sursa (job #2657450) | Cod sursa (job #411601) | Cod sursa (job #1376615) | Cod sursa (job #2098083)
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream fin("pachete.in");
ofstream fout("pachete.out");
int Ox, Oy, N, X, Y, sol;
vector< pair<int,int> > v[4];
vector<int> aux;
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_st( 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;
pair<int,int> P;
for( int i = 0; i < v[nr].size(); i++ ){
P.first = v[nr][i].first * Cos - v[nr][i].second * Sin;
P.second = 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.push_back( v[nr][0].second );
for( int i = 1; i < v[nr].size(); i++ ){
if( v[nr][i].second > aux.back() ){
aux.push_back( v[nr][i].second );
}else{
int st, dr;
st = 0;
dr = aux.size() - 1;
while( st <= dr ){
int mid = ( st + dr ) / 2;
if( aux[mid] <= v[nr][i].second )
st = mid + 1;
else
dr = mid - 1;
}
aux[dr] = 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_st( 270, 1 );
sol += solve( 1 );
rotesc_st( 180, 2 );
sol += solve( 2 );
rotesc_st( 90, 3 );
sol += solve( 3 );
fout << sol << "\n";
return 0;
}