Cod sursa(job #1988565)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 3 iunie 2017 14:26:39
Problema Gropi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <iostream>
#include <cstdlib>
#include <fstream>
#define MAXC  1000000
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a,b) ((a) < (b) ? (a) : (b))

using namespace std;

ifstream in ("gropi.in");
ofstream out("gropi.out");

int N,M,C;
long long v1[MAXC],v2[MAXC];//C - coloane , N - nr gropi , M - nr cerinte
int i,linie,col,linie1,col1,dif,diagonala;

void cit(){
    in>>C>>N;
    for( i = 0 ; i < N; i ++){
        in>>linie>>col;
        if(linie == 1){
            v1[col] = 1;
        }else if(linie == 2){
            v2[col] = 1;
        }
    }
    in>>M;
}
bool groapa(long long int v[],int y, int y1){
    int lo = MIN(y,y1),hi = MAX(y,y1);
    for(lo; lo <= hi ; lo++){
        if(v[lo] && lo != hi){
            return false;
        }
    }
    return true;
}
int lungime1(int x , int y , int x1, int y1){

    if(x == 1){
        dif = abs(y-y1)+1;
        if(groapa(v1,y,y1)){
            return dif;
        }
        return dif + 2;
    }
    if(x == 2){
        dif = abs(y-y1)+1;
        if(groapa(v2,y,y1)){
            return dif;
        }
        return dif + 2;
    }

}
int lungime2(int x, int y, int x1, int y1){
    if(y == y1){
        return 2;
    }
    diagonala = x + (x1 - x);
    //cout<<diagonala<<endl;
    if(y < y1){
        return lungime1(x,y,diagonala,y1-1)+2;
    }else if(y > y1){
        //cout<<x1<<" "<<y1<<" " <<diagonala<<" "<<y-1<<" ";
        return lungime1(x1,y1,diagonala,y-1)+2;
    }


}
int RandomFloat(int a, int b)
{
    int Number = std::rand() % (b + 1 - a) + a;
    return Number;
}
void evaluator(){
    for(i = 1; i < 20 ; i ++){
        linie = RandomFloat(1,2);
        linie1 = RandomFloat(1,2);
        col = RandomFloat(1,C);
        col1 = RandomFloat(1,C);
        out<<linie<<" "<<col<<" "<<linie1<<" "<<col1<<endl;
        if(linie == linie1){
            out<<lungime1(linie,col,linie1,col1)<<"\n";
        }else if(linie != linie1){
            out<<lungime2(2,col,2,col1)<<"\n";
        }
    }

}
void verif(){

    for(i = 0; i < M; i ++){

        in>>linie>>col>>linie1>>col1;
        if(linie == linie1){
            out<<lungime1(linie,col,linie1,col1)<<"\n";
        }else if(linie != linie1){
            out<<lungime2(linie,col,linie1,col1)<<"\n";
        }

    }
}


int main()
{
    cit();

    verif();
    //evaluator();

    return 0;
}