Gym - 100920H 2010-2011 OpenCup IX Onsite, II Yandex Summer School H.Squares 暴力
题意:有10w个点,问你选4个点,能组成平行于坐标轴的正方形有多少个
题解:不知道正解,我的做法就是暴力的基础上优化一点,每次按x排好序,每次枚举的2个点都是x相同的
这样算是个优化?但并不能过,因为可能一列全是x相同的,于是又判了一次对于这个点,x相同的多还是y相同的多
具体实现用了个set没想到就过了
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 2000006 4 set<int>x[N],y[N]; 5 int n,a[N],b[N],ans=0; 6 int main() 7 { 8 scanf("%d",&n); 9 for (int i=1;i<=n;i++) 10 { 11 scanf("%d%d",&a[i],&b[i]); 12 a[i]+=1e6;b[i]+=1e6; 13 x[a[i]].insert(b[i]); 14 y[b[i]].insert(a[i]); 15 } 16 for (int i=1;i<=n;i++) 17 { 18 if (x[a[i]].size()<y[b[i]].size()) 19 { 20 set<int>::iterator it=x[a[i]].upper_bound(b[i]); 21 while (it!=x[a[i]].end()) 22 { 23 int l=*it-b[i]; 24 if (a[i]+l<N) 25 if (x[a[i]+l].find(b[i]+l)!=x[a[i]+l].end() && x[a[i]+l].find(b[i])!=x[a[i]+l].end()) ans++; 26 it++; 27 } 28 }else 29 { 30 set<int>::iterator it=y[b[i]].upper_bound(a[i]); 31 while (it!=y[b[i]].end()) 32 { 33 int l=*it-a[i]; 34 if (b[i]+l<N) 35 if (y[b[i]+l].find(a[i]+l)!=y[b[i]+l].end() && y[b[i]+l].find(a[i])!=y[b[i]+l].end()) ans++; 36 it++; 37 } 38 } 39 } 40 cout<<ans<<endl; 41 }
Anderyi!