被重复坐标的点搞的混乱不堪,后来才想起来把重复坐标的点合并到一个存储单元即可。真是弱爆了。分别按横纵坐标处理一下相邻点对,两边各加上对方的点个数,即可得邻居数。一直觉着USTCOJ的RE给的有问题,虽然别的也会有时把TLE判成RE,但是在USTCOJ上碰RE碰的略多了一点。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct point
{
int x,y,s;
}p[100100];
struct point2
{
int x,y,s,ci;
}p1[100100];
bool cm1(const struct point &a,const struct point &b)//与要排序的变量类型一致
{
if (a.x!=b.x) return a.x<b.x;
else return a.y<b.y;
}//升序
bool cm2(const struct point2 &a,const struct point2 &b)
{
if (a.y!=b.y) return a.y<b.y;
else return a.x<b.x;
}
int main()
{
int n,k,m,i,j,t=0,ii,kk;
while(1)
{
scanf("%d%d%d",&k,&n,&m);
if ((k==0)&&(n==0)&&(m==0)) break;
kk=0;
for (i=1;i<=k;i++) scanf("%d%d",&p[i].x,&p[i].y);
for (i=1;i<=k;i++) p[i].s=0;
p1[0].x=p1[0].y=0;
sort(p+1,p+k+1,cm1);
for (i=1;i<=k;i++)
{
if ((p[i].x!=p1[kk].x) || (p[i].y!=p1[kk].y))
{
kk++;
p1[kk].x=p[i].x;
p1[kk].y=p[i].y;
p1[kk].s=0;
p1[kk].ci=1;
}
else if ((p[i].x==p1[kk].x) || (p[i].y==p1[kk].y))
{
p1[kk].s++;
p1[kk].ci++;
}
}
for (i=1;i<kk;i++)
if ((p1[i].x==p1[i+1].x)&&((p1[i].y+1)>=p1[i+1].y))
{
p1[i].s+=p1[i+1].ci;
p1[i+1].s+=p1[i].ci;
}
sort(p1+1,p1+kk+1,cm2);
for (i=1;i<kk;i++)
if ((p1[i].y==p1[i+1].y)&&((p1[i].x+1)>=p1[i+1].x))
{
p1[i].s+=p1[i+1].ci;
p1[i+1].s+=p1[i].ci;
}
int sum=0;
for (i=1;i<=kk;i++)
if (p1[i].s<2) sum+=p1[i].ci;
t++;
printf("Case %d: ",t);
cout<<sum<<endl;
}
return 0;
}