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 }
  • 相关阅读:
    django-form表单
    django-登录页面添加验证码
    opensatck误删除service项目
    运维脚本
    大数据平台架构组件选择与运用场景
    HDP2.4安装(五):集群及组件安装
    Spark(三): 安装与配置
    Spark(二): 内存管理
    Spark(一): 基本架构及原理
    ElasticSearch基本使用
  • 原文地址:https://www.cnblogs.com/RenSheYu/p/12274200.html
Copyright © 2011-2022 走看看