Cod sursa(job #1709955)

Utilizator team_nameUPB Banu Popa Visan team_name Data 28 mai 2016 14:34:59
Problema Metrou4 Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.81 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;

const int nmax = 150010;

int t, n, x[nmax], y[nmax];
vector<pair<int, int> > p;

long long solve()
{
    long long now = 0;
    set<int> prv;

    for (int i = 0; i < p.size(); ++ i)
    {
        int j = i;
        while (j < p.size() && p[i].first == p[j].first) j ++;
        j --;

        now += p[j].second - p[i].second;

        if (prv.empty())
        {
            for (int k = i; k <= j; ++ k)
                prv.insert(p[k].second);
            i = j;
            continue;
        }
        int mn = *prv.begin(), mx = *prv.rbegin();

        long long nowBest = (1LL << 62);

        for (int k = i; k <= j; ++ k)
            if (p[k].second <= mn)
                nowBest = min(nowBest, 1LL * (p[i].first - p[i - 1].first + mn - p[k].second));
            else if (p[k].second >= mx)
                nowBest = min(nowBest, 1LL * (p[i].first - p[i - 1].first + p[k].second - mx));
            else 
                nowBest = min(nowBest, 2LL * (p[i].first - p[i - 1].first));

        now += nowBest;

        prv.clear();
        for (int k = i; k <= j; ++ k)
            prv.insert(p[k].second);
        i = j;
    }

    return now;
}

int main()
{
    freopen("metrou4.in", "r", stdin);
    freopen("metrou4.out", "w", stdout);

    scanf("%i", &t);
    for (; t; -- t)
    {
        p.clear();

        scanf("%i", &n);
        for (int i = 1; i <= n; ++ i)
        {
            scanf("%i %i", &x[i], &y[i]);
            p.push_back(make_pair(x[i], y[i]));
        }
        sort(p.begin(), p.end());

        long long ans = solve();
        for (int i = 0; i < n; ++ i)
            swap(p[i].first, p[i].second);
        sort(p.begin(), p.end());
        ans = min(ans, solve());

        printf("%lld\n", ans);
    }
}