Cod sursa(job #1787524)

Utilizator MateiMCCiurezu Matei MateiMC Data 24 octombrie 2016 19:32:26
Problema Pachete Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.96 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define CEVA 50005
using namespace std;
ifstream fin("pachete.in");
ofstream fout("pachete.out");
long n, i, nr_drumuri=0;
long long x_sediu, y_sediu, x_client, y_client;
vector < pair<long,long> > clienti_1;
vector < pair<long,long> > clienti_2;
vector < pair<long,long> > clienti_3;
vector < pair<long,long> > clienti_4;
vector < pair<long,long> > clienti_n;
vector < pair<long,long> > clienti_s;
vector < pair<long,long> > clienti_e;
vector < pair<long,long> > clienti_v;

int main()
{
    fin>>n;
    fin>>x_sediu>>y_sediu;
    
    for(int i=1; i<=n; i++){
        fin>>x_client>>y_client;
        //determin directia fata de sediu: 1=Nord-Est, 2=Nord-Vest, 3=Sud-Vest, 4=Sud-Est
        if(y_client>y_sediu){
            //se afla la Nord de sediu
            if(x_client>x_sediu){
                //se afla la Est de sediu -> Nord-Est -> 1
                clienti_1.push_back(make_pair(x_client-x_sediu, y_client-y_sediu));
            }
            else if(x_client<x_sediu){
                //se afla la Vest de sediu -> Nord-Vest -> 2
                clienti_2.push_back(make_pair(x_sediu-x_client, y_client-y_sediu));
            }
            else{
                //intre Est si Vest, la Nord
                clienti_n.push_back(make_pair(0, y_client-y_sediu));
            }
        }
        else if(y_client<y_sediu){
            //se afla la Sud de sediu
            if(x_client<x_sediu){
                //se afla la Vest de sediu -> Sud-Vest -> 3
                clienti_3.push_back(make_pair(x_sediu-x_client, y_sediu-y_client));
            }
            else if(x_client>x_sediu){
                //se afla la Est de sediu -> Sud-Est -> 4
                clienti_4.push_back(make_pair(x_client-x_sediu, y_sediu-y_client));
            }
            else{
                //intre Est si Vest, la Sud
                clienti_s.push_back(make_pair(0, y_sediu-y_client));
            }
        }
        else{
            //intre Nord si Sud
            if(x_client>x_sediu){
                //la Est
                clienti_e.push_back(make_pair(x_client-x_sediu, 0));
            }
            else{
                //la Vest
                clienti_v.push_back(make_pair(x_sediu-x_client, 0));
            }
        }
        
    }
    
    long nr_n=clienti_n.size()-1, nr_s=clienti_s.size()-1;
    long nr_e=clienti_e.size()-1, nr_v=clienti_v.size()-1;
    
    if(clienti_1.size()){
        while(nr_n>=0){
            clienti_1.push_back(make_pair(clienti_n[nr_n].first, clienti_n[nr_n].second));
            nr_n--;
        }
        while(nr_e>=0){
            clienti_1.push_back(make_pair(clienti_e[nr_e].first, clienti_e[nr_e].second));
            nr_e--;
        }
    }
    else{
        while(nr_n>=0){
            clienti_2.push_back(make_pair(clienti_n[nr_n].first, clienti_n[nr_n].second));
            nr_n--;
        }
        while(nr_e>=0){
            clienti_4.push_back(make_pair(clienti_e[nr_e].first, clienti_e[nr_e].second));
            nr_e--;
        }
    }
    
    if(clienti_3.size()){
        while(nr_s>=0){
            clienti_3.push_back(make_pair(clienti_s[nr_s].first, clienti_s[nr_s].second));
            nr_s--;
        }
        while(nr_v>=0){
            clienti_3.push_back(make_pair(clienti_v[nr_v].first, clienti_v[nr_v].second));
            nr_v--;
        }
    }
    else{
        while(nr_v>=0){
            clienti_2.push_back(make_pair(clienti_v[nr_v].first, clienti_v[nr_v].second));
            nr_v--;
        }
        while(nr_s>=0){
            clienti_4.push_back(make_pair(clienti_s[nr_s].first, clienti_s[nr_s].second));
            nr_s--;
        }
    }
    
    sort(clienti_1.begin(), clienti_1.end());
    sort(clienti_2.begin(), clienti_2.end());
    sort(clienti_3.begin(), clienti_3.end());
    sort(clienti_4.begin(), clienti_4.end());
    
    if(clienti_1.size()){
        i=clienti_1.size()-1;
        nr_drumuri++;
        while(i>=1){
            if(clienti_1[i].second<clienti_1[i-1].second && clienti_1[i].first!=clienti_1[i-1].first){
                nr_drumuri++;
            }
            i--;
        }
    }
    
    if(clienti_2.size()){
        i=clienti_2.size()-1;
        nr_drumuri++;
        while(i>=1){
            if(clienti_2[i].second<clienti_2[i-1].second && clienti_2[i].first!=clienti_2[i-1].first){
                nr_drumuri++;
            }
            i--;
        }
    }
    
    if(clienti_3.size()){
        i=clienti_3.size()-1;
        nr_drumuri++;
        while(i>=1){
            if(clienti_3[i].second<clienti_3[i-1].second && clienti_3[i].first!=clienti_3[i-1].first){
                nr_drumuri++;
            }
            i--;
        }
    }
    
    if(clienti_4.size()){
        i=clienti_4.size()-1;
        nr_drumuri++;
        while(i>=1){
            if(clienti_4[i].second<clienti_4[i-1].second && clienti_4[i].first!=clienti_4[i-1].first){
                nr_drumuri++;
            }
            i--;
        }
    }
    
    fout<<nr_drumuri;
    
    return 0;
}