[solution] JZOJ3493 三角形

Description

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

Input

  1. 第一行一个整数n
  2. 接下来n行,每行两个整数,表示点的坐标。

Output

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

Sample Input

  1. 5
  2. 0 0
  3. 1 1
  4. 1 -1
  5. -1 -1
  6. -1 1

Sample Output

  1. 8

Data Constraint

  1. 对于50%的数据,n<=300
  2. 对于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

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<cstdlib>
  6. #include<algorithm>
  7. #define ll long long
  8. #define maxn 3005
  9. using namespace std;
  10. ll n,a[maxn],b[maxn];
  11. double k[maxn];
  12. void init(){
  13. scanf("%lld",&n);
  14. for(ll i=1;i<=n;i++)
  15. scanf("%lld %lld",a+i,b+i);
  16. return;
  17. }
  18. ll cmp(double a,double b){return a-b<0.00000001;}
  19. void solve(){
  20. ll ans=n*(n-1)*(n-2)/6;
  21. for(ll i=1;i<=n-2;i++){
  22. for(ll j=1;j<=n;j++) k[i]=99999999999.9999;
  23. for(ll j=i+1;j<=n;j++)
  24. if(a[i]==a[j]) k[j]=999999999999.9999;
  25. else k[j]=(double)(b[i]-b[j])/(double)(a[i]-a[j]);
  26. sort(k+i+1,k+n+1,cmp);
  27. ll cnt=1,lst=i;
  28. for(ll kk=i+1;kk<=n;kk++){
  29. if(abs(k[kk]-k[lst])<0.000000001) cnt++;
  30. else{
  31. lst=kk;
  32. ans-=cnt*(cnt-1)/2;
  33. cnt=1;
  34. }
  35. }
  36. ans-=cnt*(cnt-1)/2;
  37. }
  38. printf("%lld\n",ans);
  39. }
  40. int main(){
  41. freopen("triangle.in","r",stdin);
  42. freopen("triangle.out","w",stdout);
  43. init();
  44. solve();
  45. return 0;
  46. }

[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. Centos6搭建sftp服务器

    一.创建sftp相关用户和目录 [root@mail samba]# useradd -s /sbin/nologin -M sftp_user #创建一个系统用户,按需设置登录的shell和家目录 ...

  2. 可视化神器--Plotly

    数据分析离不开数据可视化.我们最常用的就是pandas,matplotlib,pyecharts当然还有Tableau,看到一篇文章介绍plotly制图后我也跃跃欲试,查看了相关资料开始学习plotl ...

  3. django之 F&Q 聚合与分组

    F 使用查询条件的值,专门取对象中某列值的操作,可以对同一个表中的两个列进行比较 from django.db.models import F ret=models.Book.objects.filt ...

  4. 手把手教你如何用 OpenCV + Python 实现人脸识别

    下午的时候,配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like 通俗的来讲,就是作为人脸特 ...

  5. Redis-Sentinel 数据源配置

    1.redis配置文件 : redis.properties # Redis settings #sentinel_node_1 redis.sentinel1.host=192.168.0.1 re ...

  6. Week__8

    Monday_ 今晚补了扔鸡蛋问题的动态规划问题,补了这道题,感觉视野又开阔了些. 写了一道思维题cf 1066A 数字逻辑后半节听得打脑壳,现在很晚了,明天再看叭. Tuesday_ 今晚补了 ad ...

  7. 关于吴恩达机器学习支持向量机的问题,讲到对偶前有一个最小化f(w)使用拉格朗日求解时转化成一个最大的相等式的理解和一些困惑

    (纯属个人理解) 参考: https://www.zhihu.com/question/267482928 https://www.cnblogs.com/90zeng/p/Lagrange_dual ...

  8. MQ队列堵塞无法读取经验总结

    问题现象: 1号发生本地来帐队列无法读取消息的问题,导致来帐报文均无法正常处理. 原因分析: 应用系统没有修改或上包,昨天交易和消息读取还是一切正常,mbfe的状态也是正常,mq的状态正常,以上正常可 ...

  9. 图论最短路径算法总结(Bellman-Ford + SPFA + DAGSP + Dijkstra + Floyd-Warshall)

    这里感谢百度文库,百度百科,维基百科,还有算法导论的作者以及他的小伙伴们...... 最短路是现实生活中很常见的一个问题,之前练习了很多BFS的题目,BFS可以暴力解决很多最短路的问题,但是他有一定的 ...

  10. [leetcode]31. Next Permutation下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...