// UVa 11106 - Rectilinear Polygon
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define integer signed long long int
struct point {
integer x, y;
int z;
};
point p[100000];
int lnk[100000][2];
bool byx(point a, point b) {
return a.x < b.x || (a.x == b.x && a.y < b.y);
}
bool byy(point a, point b) {
return a.y < b.y || (a.y == b.y && a.x < b.x);
}
int main() {
int tt;
scanf("%d", &tt);
for (int t = 0; t < tt; t++) {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%lld%lld", &p[i].x, &p[i].y);
p[i].z = i;
}
integer sol = 0;
sort(p, p + n, byx);
int c = 1;
for (int i = 1; i < n; i++) {
if (p[i].x == p[i - 1].x)
c++;
else {
if (c & 1) {
sol = -1;
break;
}
c = 1;
}
if ((c & 1) == 0) {
sol += p[i].y - p[i - 1].y;
lnk[p[i].z][0] = p[i - 1].z;
lnk[p[i - 1].z][0] = p[i].z;
}
}
if (c & 1)
sol = -1;
if (sol != -1) {
sort(p, p + n, byy);
c = 1;
for (int i = 1; i < n; i++) {
if (p[i].y == p[i - 1].y)
c++;
else {
if (c & 1) {
sol = -1;
break;
}
c = 1;
}
if ((c & 1) == 0) {
sol += p[i].x - p[i - 1].x;
lnk[p[i].z][1] = p[i - 1].z;
lnk[p[i - 1].z][1] = p[i].z;
}
}
if (c & 1)
sol = -1;
}
//
int a = 0, d = 0;
int m = 1;
while (true) {
d = (d + 1) & 1;
int b = lnk[a][d];
if (b == 0)
break;
a = b;
m++;
}
if (m < n)
sol = -1;
cout << sol << endl;
}
return 0;
}
Friday, May 15, 2015
UVa 11106 - Rectilinear Polygon
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment