[solution] JZOJ3493 三角形

Description

平面上有n个点,求出用这些点可以构成的三角形数。

Input

第一行一个整数n。

接下来n行,每行两个整数,表示点的坐标。

Output

输出仅一个整数,表示所求答案。

Sample Input

5

0 0

1 1

1 -1

-1 -1

-1 1

Sample Output

8

Data Constraint

对于50%的数据,n<=300。

对于100%的数据,n<=3000,坐标的绝对值不超过10^4,保证没有重合的点。

华丽的分割线


这个题就是求$n$个点之间能构成的三角形数

50分解法

暴力的解法就是$O(n^3)$的复杂度判三点共线,判定的方法就是看斜率是否相等,这里可以使用$x_1y_2=x_2y_1$来判断(自己去证),这样子可以搞定斜率为不存在(连线垂直于$x$轴)的情况。

100分做法

考虑到这里的$n$是$\leq3000$的,所以直接去暴力判重会爆掉,所以说我们要对其进行优化,正解给出了一个玄学的思路:

通过排序来完成判重

是不是很意外??

没错就是这种古老的被我们遗忘的做法

具体做法:

每次枚举一个点$i$,枚举编号大于等于$i$的顶点,计算出斜率$k$,显然,如果三点共线的话,斜率是相同的,如果相同的有$p$个,那么根据排列组合就应该在总数中减去$Cp_3$个,注意判重的精度要高一些,不然会炸。原来的总数是多少呢,显然是$Cn_3$。

AC Code

841ms,364KB

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define ll long long
#define maxn 3005
using namespace std;
ll n,a[maxn],b[maxn];
double k[maxn];
void init(){
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
scanf("%lld %lld",a+i,b+i);
return;
}
ll cmp(double a,double b){return a-b<0.00000001;}
void solve(){
ll ans=n*(n-1)*(n-2)/6;
for(ll i=1;i<=n-2;i++){
for(ll j=1;j<=n;j++) k[i]=99999999999.9999;
for(ll j=i+1;j<=n;j++)
if(a[i]==a[j]) k[j]=999999999999.9999;
else k[j]=(double)(b[i]-b[j])/(double)(a[i]-a[j]);
sort(k+i+1,k+n+1,cmp);
ll cnt=1,lst=i;
for(ll kk=i+1;kk<=n;kk++){
if(abs(k[kk]-k[lst])<0.000000001) cnt++;
else{
lst=kk;
ans-=cnt*(cnt-1)/2;
cnt=1;
}
}
ans-=cnt*(cnt-1)/2;
}
printf("%lld\n",ans);
}
int main(){
freopen("triangle.in","r",stdin);
freopen("triangle.out","w",stdout);
init();
solve();
return 0;
}

[solution] JZOJ3493 三角形的更多相关文章

  1. @topcoder - 2017TCOAlgorithmRound2A - D1L2@ DistanceZeroAndOne

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个 n 个点的无向简单的连通图,编号从 0 到 n-1. 现给 ...

  2. [LeetCode] Triangle 三角形

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  3. 【bzoj3505】 Cqoi2014—数三角形

    http://www.lydsy.com/JudgeOnline/problem.php?id=3505 (题目链接) 题意 给定一个n*m的网格,请计算三点都在格点上的三角形共有多少个. Solut ...

  4. css 实现三角形 实现过程

     1.纯色的全等的三角形实现 下面的就是实际实现  没有宽高 只有边框 都是透明 根据箭头的方向 给边框方法加颜色  比如需要像右箭头 只需要给border-right-color:颜色值; 即可 c ...

  5. UVa OJ 194 - Triangle (三角形)

    Time limit: 30.000 seconds限时30.000秒 Problem问题 A triangle is a basic shape of planar geometry. It con ...

  6. lintcode:数字三角形

    题目: 数字三角形 给定一个数字三角形,找到从顶部到底部的最小路径和.每一步可以移动到下面一行的相邻数字上. 样例 比如,给出下列数字三角形: [      [2],     [3,4],    [6 ...

  7. LeetCode Triangle 三角形(最短路)

    题意:给一个用序列堆成的三角形,第n层的元素个数为n,从顶往下,每个元素可以选择与自己最近的两个下层元素往下走,类似一棵二叉树,求最短路. [], [,4], [6,,7], [4,,8,3] 注意: ...

  8. [LeetCode 120] - 三角形(Triangle)

    问题 给出一个三角形,找出从顶部至底部的最小路径和.每一步你只能移动到下一行的邻接数字. 例如,给出如下三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 从顶部至底部的最 ...

  9. 三角形(Triangle)

    三角形(Triangle) 问题 给出一个三角形,找出从顶部至底部的最小路径和.每一步你只能移动到下一行的邻接数字. 例如,给出如下三角形: [ [2], [3,4], [6,5,7], [4,1,8 ...

随机推荐

  1. 八(第一篇)、主体结构元素——article元素、section元素

    article元素 article元素代表文档.页面或应用程序中独立的.完整的.可以独自被外部引用的内容. 他可以是一篇博客或者报刊中的文章,一篇轮胎帖子.一段用户评论或独立的插件,或其他任何独立的插 ...

  2. SpringBoot入门篇--关于properties和yml两种配置文件的一些事情

    我们在使用SpringBoot这个框架的时候都一定使用或者说是见到过application.properties或者是application.yml,经不住有人就会问这俩文件到底是什么情况,其实说白了 ...

  3. Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图

    VectorDrawable 矢量图 三部曲: Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图 Android 开发 VectorDrawabl ...

  4. kubernets网络模式

    参考:https://www.kubernetes.org.cn/2059.html

  5. C#中EXCEL表格的内容进度条实现

    public void ExportToExcel() { DataTable dt = getDataTable(); if (dt == null) { MessageBox.Show(" ...

  6. leetcode543

    /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...

  7. IOS 发布 升级新版本

    ERROR ITMS-90725: "SDK Version Issue. ERROR ITMS-90725: "SDK Version Issue. This app was b ...

  8. ecs主机被破解后下载的执行文件的脚本

    #!/bin/bashchmod 777 xiaochattr 777 haha/etc/init.d/iptables stop;service iptables stop;SuSEfirewall ...

  9. Python __slots__限制动态添加变量

    Python是一种非常灵活的动态语言,有时感觉太灵活以至于不知道遵循什么样的规则去驾驭.不过Python已经是非常完备的语言,想实现什么样的功能都是有方法的,而且也很容易,比如限制一个类动态添加成员变 ...

  10. RGB颜色值转化为long 型数字

    通常我们表达颜色都是使用RGB值表示的,今天在VB中设置RGB值居然是一个整形数字,网上各种搜资料发现这个数字是怎么来的: 数值= 65536*Blue + 256* Green + Red