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 }

 

posted @ 2019-04-02 10:53  口香糖万岁  阅读(216)  评论(0编辑  收藏  举报