zoukankan      html  css  js  c++  java
  • 【题解】洛谷 P6355 [COCI2007-2008#3] DEJAVU

    题目传送门

    (洛谷P6355)

    https://www.luogu.com.cn/problem/P6355

    题目大意

    给出坐标系中的 n个点,求以不同的三个点组成的 直角边与坐标轴平行的直角三角形个数。

    分析

    由题意可以知道:如果我们设符合要求的三角形直角顶点坐标为 A(x1,y1),那么剩下两点坐标一定为 B(x1,yi)、 C(xj,y1)。所以,如果我们确定一个点为直角顶点,那么可以与之配合成为目标三角形的只有是横、纵坐标都与之相同的点。

    由此,我们可以考虑用两个数组 sumx、 sumy来记录一个横坐标或纵坐标上的点的个数,明显的,当直角顶点为 A(x1,y1)时,可以组成的目标三角形个数为

    (sumx(x1)−1)×(sumy(y1)−1)

    (注:-1是减去当前所在的点)

    由此,我们可以枚举每个点,取出它所在的横、纵坐标,用上面的公式计算出在这个点可以组成的目标三角形个数,累加起来,就是答案啦~

    分析结束,上代码!

    Code

    P.S.: 3≤n<105,日常爆int,不开long long两行泪。

     1 #include<bits/stdc++.h>
     2 #define ll long long
     3 using namespace std;
     4 const int M=100005;
     5 struct node{
     6     ll x,y;
     7 }p[M];
     8 int n;
     9 ll sx[M],sy[M];
    10 ll ans=0;
    11 int main()
    12 {
    13     scanf("%d",&n);
    14     for(int i=1;i<=n;i++){
    15         scanf("%lld%lld",&p[i].x,&p[i].y);
    16         sx[p[i].x]++;
    17         sy[p[i].y]++;
    18     }
    19     for(int i=1;i<=n;i++)
    20         ans+=(sx[p[i].x]-1)*(sy[p[i].y]-1);
    21     printf("%lld",ans);
    22     return 0;
    23 }


    完结撒fa~

  • 相关阅读:
    开课博客
    高级UI组件(二)
    《梦断代码》读后感(三)
    高级UI组件
    今日总结
    今日总结
    android中关于时间的控件
    单选按钮和复选框
    Android开发中按钮的语法
    布局管理器的嵌套
  • 原文地址:https://www.cnblogs.com/unknown-year/p/13802195.html
Copyright © 2011-2022 走看看