← Back to List

14746번: Closest Pair ↗

Solutions

C++14
1.9 KB | 1907 chars
#include <iostream>
#include <algorithm>
#include <vector>
#define ll long long

using namespace std;
struct A {
    ll X, K; //K = kind
};
struct B {
    ll X, B; // K bitmasking
};

ll N,M,input,Min=99987654321,cnt=0;
ll C1,C2;
A ar[1100000];
vector <B> V;

bool compare1(A a, A b) {
    if(a.X < b.X) return true;
    if(a.X == b.X) {
        if(a.K < b.K) return true;
    }
    return false;
}

ll f(ll k) {
    if(k>0) return k;
    return -k;
}

int main() {
    cin >> N >> M;
    cin >> C1 >> C2;
    for(int x=0; x<N; x++) {
        cin>>input;
        ar[x].X = input;
        ar[x].K = 1;
    }
    for(int x=0; x<M; x++) {
        cin >>input;
        ar[x+N].X = input;
        ar[x+N].K = 2; 
    }

    sort(ar,ar+N+M,compare1);
    for(int x=0; x<N+M; x++) {
        if(x+1 <N+M) {
            if(ar[x+1].X == ar[x].X) {
                V.push_back({ar[x].X,ar[x].K|ar[x+1].K});
                x++;
            } else {
                V.push_back({ar[x].X,ar[x].K});
            }
        }
        else {
            V.push_back({ar[x].X,ar[x].K});
        }
    }

    for(int x=1; x<V.size(); x++) {
        if(V[x-1].B &1 && V[x].B &2) {
            if(V[x].X - V[x-1].X < Min) {
                Min = V[x].X - V[x-1].X;
                cnt=1;
            }
            else if(V[x].X - V[x-1].X == Min) {
                cnt++;
            }
        }
        if(V[x-1].B &2 && V[x].B &1) {
            if(V[x].X - V[x-1].X < Min) {
                Min = V[x].X - V[x-1].X;
                cnt=1;
            }
            else if(V[x].X - V[x-1].X == Min) {
                cnt++;
            }
        }
    }
    int zero_cnt=0;
    for(int x=0; x<V.size(); x++) {
        if(V[x].B == 3) {
            Min = 0;
            zero_cnt++;
        }
    }

    if(zero_cnt > 0) {
        cout<<f(C1-C2)<<" "<<zero_cnt;
    }
    else {
        cout<<f(C1-C2)+Min << " "<< cnt;
    }
}