#include<cstdio>
#include<algorithm>
using namespace std;
struct point
{
int x,y;
int id;
}p[100000];
struct line
{
int x,y1,y2;
line(){}
line(int a,int b,int c):x(a),y1(b),y2(c)
{}
}L[100000];
int con[100000][2];
int n,ln;
bool cmp_x(const point a,const point b)
{
if(a.x!=b.x)
return a.x<b.x;
else
return a.y<b.y;
}
bool cmp_y(const point a,const point b)
{
if(a.y!=b.y)
return a.y<b.y;
else
return a.x<b.x;
}
bool judge(const point a,const point b)
{
int i;
int y=a.y,x1=a.x,x2=b.x;
for(i=0;i<ln;i++)
{
if(x1<L[i].x&&x2>L[i].x&&L[i].y1<y&&L[i].y2>y)
return 1;
}
return 0;
}
int main()
{
int T,i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
p[i].id=i;
}
sort(p,p+n,cmp_x);
int sum=0,cnt=1,flag=0;
ln=0;
for(i=1;i<n&&!flag;i++)
{
if(p[i].x!=p[i-1].x)
{
if(cnt&1)
flag=1;
cnt=1;
}
else
{
cnt++;
if((cnt&1)==0)
{
sum+=p[i].y-p[i-1].y;
con[p[i].id][0]=p[i-1].id;
con[p[i-1].id][0]=p[i].id;
L[ln++]=line(p[i].x,p[i-1].y,p[i].y);
}
}
}
if(flag==1)
{
printf("-1\n");
continue;
}
cnt=1;
sort(p,p+n,cmp_y);
for(i=1;i<n&&!flag;i++)
{
if(p[i].y!=p[i-1].y)
{
if(cnt&1)
flag=1;
cnt=1;
}
else
{
cnt++;
if((cnt&1)==0)
{
sum+=p[i].x-p[i-1].x;
con[p[i].id][1]=p[i-1].id;
con[p[i-1].id][1]=p[i].id;
if(judge(p[i-1],p[i]))
flag=1;
}
}
}
if(flag==1)
{
printf("-1\n");
continue;
}
int s=1,x=0,ans=0;
do
{
x=con[x][s];
s=1^s;
ans++;
}while(x!=0&&!flag);
if(ans!=n)
printf("-1\n");
else
printf("%d\n",sum);
}
}
poj 3293 计算几何
最新推荐文章于 2019-08-07 10:05:54 发布