正方形计数[luoguP1665]/caioj[1221]

版权声明:作为一个蒟蒻,转载时请通知我这个蒟蒻 https://blog.csdn.net/zyszlb2003/article/details/89855246

欢迎大家访问我的老师的OJ———caioj.cn

题面描述

弱化传送门
传送门

思路

在这里插入图片描述

已知 A A H H 点。

易证 A B C E B D \vartriangle ABC≌\vartriangle EBD

之后我们求对角线交点 B B 坐标,用交点坐标求 E E 点坐标解即可。

上面那个点类似。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define ll long long
using namespace std;
const int N=510;
bool v[N][N];
struct node{int x,y;}a[N];
inline bool pd(int x1,int x2,int y1,int y2){return 0<=x1&&x1<=300&&0<=x2&&x2<=300&&0<=y1&&y1<=300&&0<=y2&&y2<=300;}
int main()
{
	int n;scanf("%d",&n);int ans=0;
	for(int i=1;i<=n;i++)
	scanf("%d%d",&a[i].x,&a[i].y),
	(a[i].x+=51)<<=1,(a[i].y+=51)<<=1,
	v[a[i].x][a[i].y]=1;
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
		{
			int xmid=(a[i].x+a[j].x)>>1,ymid=(a[i].y+a[j].y)>>1;
			int x1=xmid-(a[i].y-ymid),y1=ymid-(xmid-a[i].x);
			int x2=xmid+(a[i].y-ymid),y2=ymid+(xmid-a[i].x);
			if(pd(x1,x2,y1,y2)&&v[x1][y1]&&v[x2][y2])ans++;
		}
	printf("%d\n",ans>>1);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zyszlb2003/article/details/89855246