题意比较简单,就是在一堆点用找能组成正方形的点,看能找出多少组。
开始没思路,怕超时。上网找了找,基本思路是枚举两个点,查找另外两个看存不存在。这个就是简单的几何,因为点是排过序的,我们只需要找到两个点在左面(如果y值一样就在下面)的情况,但这样还会多算一遍,因为一个正方形要有两条边在左面(或一条左一条下),所以要除以2。
查找有用二分查找的,有用hash的。因为stl里有二分查找函数,所以好写些。
时间1.5s多
刚才突然想到用set写,结果用时2.6s多……
set<node>::iterator ita, itb;
for (ita = s.begin(); ita != s.end(); ita++)
{
for (itb = ita; itb != s.end(); itb++)
{
if (ita == itb)
continue;
node p0, p1;
p0.x = ita->x + itb->y - ita->y;
p0.y = ita->y + ita->x - itb->x;
p1.x = itb->x + itb->y - ita->y;
p1.y = itb->y + ita->x - itb->x;
if (s.find(p0)== s.end())
continue;
if (s.find(p1)==s.end())
continue;
sum++;
}
}
printf("%d/n", sum / 2);
}
return 0;
}
后来发现可以一个正方形只算一次,时间降到了700ms+