注意:用vector離散化時,先sort,再unique。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int tree[10005],f[10005],n;
vector<int> d;
struct point{
int x,y,id;
bool isl;
}p[10005];
bool cmpx(const point &a,const point &b)
{
if(a.x==b.x)
return a.y<b.y;
else
return a.x<b.x;
}
bool cmpy(const point &a,const point &b)
{
if(a.y==b.y)
return a.x<b.x;
else
return a.y<b.y;
}
void discretize()
{
sort(d.begin(),d.end());
d.resize(distance(d.begin(),unique(d.begin(),d.end())));
}
int find(int idx)
{
if(f[idx]==idx)
return idx;
else
return f[idx]=find(f[idx]);
}
void merge(int idx,int idy)
{
if(find(idx)==find(idy))
return ;
else
{
f[f[idx]]=f[idy];
return ;
}
}
int lowbit(int idx)
{
return idx&(-idx);
}
int query(int idx)
{
int i=idx,ret=0;
while(idx>0)
{
ret+=tree[idx];
idx-=lowbit(idx);
}
return ret;
}
void update(int idx,int val)
{
int i=idx;
while(idx<10005)
{
tree[idx]+=val;
idx+=lowbit(idx);
}
}
void work()
{
memset(tree,0,sizeof(tree));
scanf("%d",&n);
int i,len=0,idx1,idx2;
for(i=1;i<=n;++i)
f[i]=i;
d.clear();
for(i=1;i<=n;++i)
{
scanf("%d %d",&p[i].x,&p[i].y);
p[i].id=i;
p[i].isl=false;
d.push_back(p[i].y);
}
discretize();
sort(p+1,p+n+1,cmpy);
for(i=1;i<=n;i+=2)
{
if(p[i].y==p[i+1].y)
{
p[i].isl=true;
len+=p[i+1].x-p[i].x;
merge(p[i].id,p[i+1].id);
}
}
sort(p+1,p+n+1,cmpx);
for(i=1;i<=n;i+=2)
{
if(p[i].x==p[i+1].x)
{
len+=p[i+1].y-p[i].y;
merge(p[i].id,p[i+1].id);
}
}
for(i=2;i<=n;++i)
{
if(find(i)!=find(i-1))
{
printf("0\n");
return ;
}
}
for(i=1;i<=n;i+=2)
{
idx1=lower_bound(d.begin(),d.end(),p[i].y)-d.begin()+1;
idx2=lower_bound(d.begin(),d.end(),p[i+1].y)-d.begin()+1;
if(!p[i].isl)
update(idx1,-1);
if(!p[i+1].isl)
update(idx2,-1);
if(query(idx2)-query(idx1)!=0)
{
printf("0\n");
return ;
}
if(p[i].isl)
update(idx1,1);
if(p[i+1].isl)
update(idx2,1);
}
printf("%d\n",len);
}
int main()
{
work();
}