zoukankan      html  css  js  c++  java
  • CF13D. Triangles

    【题目链接】https://codeforces.com/problemset/problem/13/D

    【题解】

    一道非常经典而古老的三角形计数。

    考虑三角形的有向面积。

    显然有:$S_{ riangle ABC}=S_{ riangle OAB}+S_{ riangle OBC}+S_{ riangle OCA}$。

    因此对每对点先统计一遍,再枚举三个点即可 $O(1)$ 计算。

    效率 $O(n^3)$。

    【代码】

     1 #include<bits/stdc++.h>
     2 const int inf=1<<30;
     3 int cnt[510][510],n,m;
     4 struct Vector
     5 {
     6     long long x,y;
     7     Vector(long long _x=0,long long _y=0){x=_x;y=_y;}
     8     inline friend Vector operator - ( const Vector &u,const Vector &v ) { return Vector(u.x-v.x,u.y-v.y); }
     9     inline friend long long operator ^ ( const Vector &u,const Vector &v ) { return u.x*v.y-u.y*v.x; }
    10 }A[510],B[510];
    11 signed main()
    12 {
    13     scanf("%d%d",&n,&m);
    14     for ( int i=1,x,y;i<=n;i++ ) scanf("%d%d",&x,&y),A[i]=Vector(x,y);
    15     for ( int i=1,x,y;i<=m;i++ ) scanf("%d%d",&x,&y),B[i]=Vector(x,y);
    16     Vector p=Vector(-inf,-inf);
    17     for ( int i=1;i<=n;i++ ) for ( int j=1;j<=n;j++ ) if ( ((A[i]-p)^(A[j]-p))>0 )
    18     {
    19         for ( int k=1;k<=m;k++ ) cnt[i][j]+=(((A[i]-p)^(B[k]-p))>0)&(((A[j]-A[i])^(B[k]-A[i]))>0)&(((p-A[j])^(B[k]-A[j]))>0);
    20         cnt[j][i]=-cnt[i][j];
    21     }
    22     int ans=0;
    23     for ( int i=1;i<=n;i++ ) for ( int j=i+1;j<=n;j++ ) for ( int k=j+1;k<=n;k++ ) ans+=(cnt[i][j]+cnt[j][k]+cnt[k][i])==0;
    24     return !printf("%d",ans);
    25 }
  • 相关阅读:
    storm学习途径
    Spark中的RDD操作简介
    【转】Hadoop web页面的授权设定
    源码安装ipython,并在ipython中整合spark
    Spark调优
    在Java中调用C
    查看Mysql表空间大小 优化空间
    update A inner join
    kibana 汉化
    xcode-select --install不能下载该软件的解决办法
  • 原文地址:https://www.cnblogs.com/RenSheYu/p/12274200.html
Copyright © 2011-2022 走看看