zoukankan      html  css  js  c++  java
  • Gym

    题面

    题意:有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 }
  • 相关阅读:
    抓包之网络分析器- Wiresshark
    IT 技术网站收集
    XAMPP Apache + MariaDB + PHP + Perl
    http://101.132.165.115/
    LNMP 网站搭建
    10X Genomics : Single Cell Gene Expression
    PacBio下机数据如何看?
    光模块
    ubuntu 'yuan' update
    Perl 中 `cmd` 和system"cmd"的区别
  • 原文地址:https://www.cnblogs.com/qywhy/p/10641242.html
Copyright © 2011-2022 走看看