[solution] JZOJ3493 三角形
[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 三角形的更多相关文章
- @topcoder - 2017TCOAlgorithmRound2A - D1L2@ DistanceZeroAndOne
		
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个 n 个点的无向简单的连通图,编号从 0 到 n-1. 现给 ...
 - [LeetCode] Triangle 三角形
		
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
 - 【bzoj3505】 Cqoi2014—数三角形
		
http://www.lydsy.com/JudgeOnline/problem.php?id=3505 (题目链接) 题意 给定一个n*m的网格,请计算三点都在格点上的三角形共有多少个. Solut ...
 - css 实现三角形 实现过程
		
1.纯色的全等的三角形实现 下面的就是实际实现 没有宽高 只有边框 都是透明 根据箭头的方向 给边框方法加颜色 比如需要像右箭头 只需要给border-right-color:颜色值; 即可 c ...
 - UVa OJ 194 - Triangle (三角形)
		
Time limit: 30.000 seconds限时30.000秒 Problem问题 A triangle is a basic shape of planar geometry. It con ...
 - lintcode:数字三角形
		
题目: 数字三角形 给定一个数字三角形,找到从顶部到底部的最小路径和.每一步可以移动到下面一行的相邻数字上. 样例 比如,给出下列数字三角形: [ [2], [3,4], [6 ...
 - LeetCode Triangle 三角形(最短路)
		
题意:给一个用序列堆成的三角形,第n层的元素个数为n,从顶往下,每个元素可以选择与自己最近的两个下层元素往下走,类似一棵二叉树,求最短路. [], [,4], [6,,7], [4,,8,3] 注意: ...
 - [LeetCode 120] - 三角形(Triangle)
		
问题 给出一个三角形,找出从顶部至底部的最小路径和.每一步你只能移动到下一行的邻接数字. 例如,给出如下三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 从顶部至底部的最 ...
 - 三角形(Triangle)
		
三角形(Triangle) 问题 给出一个三角形,找出从顶部至底部的最小路径和.每一步你只能移动到下一行的邻接数字. 例如,给出如下三角形: [ [2], [3,4], [6,5,7], [4,1,8 ...
 
随机推荐
- List接口、Set接口和Map接口
			
1.List和Set接口继承自Collection接口,而Map不是继承的Collection接口 Map没有继承Collection接口,Map提供key到value的映射;一个Map中不能包含相同 ...
 - 模块3 re + 正则表达式
			
1. 正则表达式 匹配字符串 元字符 . 除了换行 \w 数字, 字母, 下划线 \d 数字 \s 空白符 \n \t \b 单词的边界 \W 非xxx \D \S [] 字符组 [^xxx] 非xx ...
 - django  session 的简单操作
			
#!SESSION_SAVE_EVERY_REQUEST = True 设置根据最后一次操作设置登录超时时间#!SESSION_EXPIRE_AT_BROWSER_CLOSE = True 设置是否关 ...
 - Jmeter正则表达式提取器(转载)
			
转载自 http://blog.csdn.net/qq_35885203 使用jmeter来测试时,经常会碰到需要上下文传输数据的情况,如登录后生成的token,在其他页面的操作,都需传入这个toke ...
 - leetcode53
			
public class Solution { public int MaxSubArray(int[] nums) { int max = int.MinValue; ; ; i < nums ...
 - python 爬虫启航
			
1. 使用excel(简单使用) 数据- 自网站-导入 2.you-get python爬虫入门 1.环境配置 python,request,lxml 2.原理 爬虫的框架如下: 1.挑选种子URL: ...
 - HashMap理解
			
HashMap中Capacity为数组长度,默认大小为16,size为元素个数,loadFactor为size/capacity,默认为0.75,当存储的元素个数size大于等于capacity乘以0 ...
 - (转)在T-SQL语句中访问远程数据库
			
https://www.cnblogs.com/lgx5/p/7821887.html 1.启用Ad Hoc Distributed Queries 在使用openrowset/opendatasou ...
 - cdnbest配置强制ssl跳转
			
如何配置强制ssl跳转 1. 登陆用户站点,点击下图图标: 2. 如下图添加证书和开启强制ssl即可 hsts解释和作用: 国际互联网工程组织IETF正在推行一种新的Web安全协议HTTP Stric ...
 - jdango 使用oss存储
			
安装django-aliyun-oss2-storage-0.1.5.tar.gz settings文件添加 MEDIA_ROOT = os.path.join(BASE_DIR,'upload/') ...