【UOJ 135】四轮车
四轮车 car
##【题目描述】:
在地图上散落着 n 个车轮,小 J 想用它们造一辆车。要求如下:
1. 一辆车需要四个车轮,且四个车轮构成一个正方形
2. 车轮不能移动
你需要计算有多少种造车的方案(两个方案不同当且仅当所用车轮不全相同,坐标相同的两个车轮视为不同车轮)。
##【输入描述】:
第一行一个整数 n
接下来n 行,每行两个整数 x y,表示在(x,y)处有一个车轮
##【输出描述】:
一行一个整数,表示方案数
##【样例输入】:
9
0 0
1 0
2 0
0 2
1 2
2 2
0 1
1 1
2 1
##【样例输出】:
5
##【时间限制、数据范围及描述】:
时间:1s 空间:128M
30%的数据保证 n<=30
100%的数据保证 1 <= n <= 1000; |x|, |y| < 20000
题解:暴力+二分√
#include<cstdio> #include<iostream> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<bits/stdc++.h> typedef long long ll; using namespace std; int n,m,cnt; struct node{ int x,y,z; }b[1002]; node a[1002]; bool cmp(node p,node q){ if(p.x==q.x) return p.y<q.y; return p.x<q.x; } int find(int xx,int yy,int l1,int r1){ int l=l1,r=r1; while(l<=r){ int m=(l+r)/2; if(b[m].x<xx || (b[m].x==xx && b[m].y<yy)) l=m+1; if(b[m].x>xx || (b[m].x==xx && b[m].y>yy)) r=m-1; if(b[m].x==xx && b[m].y==yy) return 1; } return 0; } ll overcome_jjj(int p,int q){ int a1=b[p].x; int b1=b[p].y; int a2=b[q].x; int b2=b[q].y; if((a2-a1)!=(b2-b1)) return 0; int f1x=a2; int f1y=b1; int f2x=a1; int f2y=b2; if(find(f1x,f1y,p,q) && find(f2x,f2y,p,q)) { //printf("%d %d %d %d\n",a1,b1,a2,b2); //printf("%d %d %d %d\n",f1x,f1y,f2x,f2y); //printf("%d\n",b[p].z*b[q].z);printf("\n"); return (ll)b[p].z*(ll)b[q].z; } return 0; } int main(){ freopen("car.in","r",stdin); freopen("car.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d %d",&a[i].x,&a[i].y); sort(a+1,a+n+1,cmp); b[1].x=a[1].x; b[1].z=1; b[1].y=a[1].y; cnt=1; for(int i=2;i<=n;i++){ if(a[i].x==a[i-1].x && a[i].y==a[i-1].y) b[cnt].z++; else { b[++cnt].x=a[i].x; b[cnt].y=a[i].y; b[cnt].z=1; } } ll ans=0; for(int i=1;i<=cnt;i++) for(int j=i+1;j<=cnt;j++) ans+=overcome_jjj(i,j); printf("%lld",ans); return 0; }