• 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 }
  • 相关阅读:
    [PTA练习] 愿天下有情人都是失散多年的兄妹(25分)
    sql server远程连接非1433端口
    java把double转化为long型
    StringUtils工具类
    JfreeChart折线图
    Log4j配置
    Ibatis,Spring整合(注解方式注入)
    Spring中的autowire属性(转)
    MyBatis3入门样例
    struts2 ibatis Spring系统架构图
  • 原文地址:https://www.cnblogs.com/qywhy/p/10641242.html
Copyright © 2020-2023  润新知