Pagini recente » Cod sursa (job #2680623) | Cod sursa (job #833922) | Cod sursa (job #349109) | Cod sursa (job #2609441) | Cod sursa (job #1709955)
#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);
}
}