【HDU 5839】Special Tetrahedron(计算几何)
空间的200个点,求出至少四边相等,且其余两边必须不相邻的四面体的个数。
用map记录距离点i为d的点有几个,这样来优化暴力的四重循环。
别人的做法是枚举两点的中垂面上的点,再把到中点距离相等的点找出来,n^3的样子。
还要注意四个点共面的情况。
共面判断就是用叉乘计算出ijk三点所在面的法向量,然后判断il向量是否和法向量垂直,是则共面。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#define eps (1e-6)
#define N 205
#define dd double
#define sqr(x) ((x)*(x))
using namespace std;
map<double,int>mm[N];
int ok[N];
struct node{
int x,y,z;
}a[N];
dd Dis[N][N];
dd dis(int i,int j)
{
if(Dis[i][j])return Dis[i][j];
return Dis[i][j]=sqrt(sqr(a[i].x-a[j].x)+sqr(a[i].y-a[j].y)+sqr(a[i].z-a[j].z));
}
node xmul(node i,node j,node k){
int z=(i.x-j.x)*(k.y-j.y)-(i.y-j.y)*(k.x-j.x);
int y=(i.z-j.z)*(k.x-j.x)-(i.x-j.x)*(k.z-j.z);
int x=(i.y-j.y)*(k.z-j.z)-(i.z-j.z)*(k.y-j.y);
return (node){x,y,z};
}
node xmul(int i,int j,int k){
return xmul(a[i],a[j],a[k]);
}
int sgn(dd a,dd b){
return fabs(a-b)>-eps&&fabs(a-b)<eps;
}
int te(int i,int j,int k,int l){//共面
node il=(node){a[i].x-a[l].x,a[i].y-a[l].y,a[i].z-a[l].z};
node s=xmul(i,j,k);
return s.x*il.x+s.y*il.y+s.z*il.z;
}
int main() {
int t,n;
scanf("%d",&t);
for(int cas=;cas<=t;cas++){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
int ans=,same=;
memset(ok,,sizeof ok);
memset(Dis,,sizeof Dis);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)mm[i].clear();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
mm[i][dis(i,j)]++;
if(mm[i][dis(i,j)]>){ok[i]=;break;}
}
for(int i=;i<=n;i++)if(ok[i])
for(int j=i+;j<=n;j++)if(ok[j])
for(int k=i+;k<=n;k++)if(ok[k]){
dd ij=dis(i,j),ik=dis(i,k),jk=dis(j,k);
if(sgn(jk,ik))
for(int l=k+;l<=n;l++)if(l!=j){
dd jl=dis(j,l),lk=dis(l,k),il=dis(i,l);
if(te(i,j,k,l)){
if(sgn(jk,jl)&&sgn(jl,il)&&sgn(il,jl))
{
ans++;
if(sgn(ij,lk)&&sgn(ij,ik))same++;
}
}
}
}
printf("Case #%d: %d\n",cas,ans-same/*);//全部边相同的会计算3次
}
}
赛后做出来的,为什么当时暴力都写不出来呢,因为在防止多算的时候给漏算了。枚举出错。
【HDU 5839】Special Tetrahedron(计算几何)的更多相关文章
- HDU 5839 Special Tetrahedron 计算几何
Special Tetrahedron 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...
- HDU 5839 Special Tetrahedron
HDU 5839 Special Tetrahedron 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n ...
- HDU 5839 Special Tetrahedron (计算几何)
Special Tetrahedron 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...
- HDU 5839 Special Tetrahedron (2016CCPC网络赛08) (暴力+剪枝)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5839 在一个三维坐标,给你n个点,问你有多少个四面体(4个点,6条边) 且满足至少四边相等 其余两边不 ...
- HDU 5130 Signal Interference(计算几何 + 模板)
HDU 5130 Signal Interference(计算几何 + 模板) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5130 Descripti ...
- (四面体)CCPC网络赛 HDU5839 Special Tetrahedron
CCPC网络赛 HDU5839 Special Tetrahedron 题意:n个点,选四个出来组成四面体,要符合四面体至少四条边相等,若四条边相等则剩下两条边不相邻,求个数 思路:枚举四面体上一条线 ...
- hdu 5839(三维几何)
Special Tetrahedron Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- HDU 5979 Convex【计算几何】 (2016ACM/ICPC亚洲区大连站)
Convex Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
随机推荐
- java 22 - 22 多线程之 匿名内部类的方式实现多线程
首先回顾下之前的匿名内部类: 匿名内部类的格式: new 接口或者接口名(){ 重写方法 }; 本质:是该类或者接口的子类对象 匿名内部类方式使用多线程 1.new Thread(){代码-}.sta ...
- RFID基础知识
BS:BinarySearch. TSA:TimeSlottedAloha. BSA:基本二进制搜索算法. DBSA:动态二进制搜索算法. RBSA:后退式二进制搜索算法. FSA:Frame Slo ...
- jq分页异步刷新 ,全局刷新问题
在做分页的时候,可能点击下一页全部刷新 这样写会导致动态刷新,页面全部刷新了 $("#pageList a").click(function () { var $s = $(thi ...
- sql server 修改表结构语法大全
1.增加字段 ) 2.删除字段 alter table table_name drop column column_name 3.修改字段类型 alter table table_name alter ...
- iOS多线程开发资源抢夺和线程间的通讯问题
说到多线程就不得不提多线程中的锁机制,多线程操作过程中往往多个线程是并发执行的,同一个资源可能被多个线程同时访问,造成资源抢夺,这个过程中如果没有锁机制往往会造成重大问题.举例来说,每年春节都是一票难 ...
- IE8以下不支持getElementsByClassName方法
function getElementsByClassName(classStr,tagName,element){ tagName = (tagName || '*'); element = (el ...
- 点透 & 解决方案
点透 & 解决方案 学习map: 现象:再现现象,总结导致点透出现的情况 分析原因 解决办法 现象 再现点透现象请使用一下方式: 手机访问传送门 复制链接到连图生成二维码后扫一扫 或者打开ch ...
- 微信v3 JSAPI最新接口错误 get_brand_wcpay_request:fail
WxPay.JsApiPay.php文件下 原始接口代码 /** * * 获取jsapi支付的参数 * @param array $UnifiedOrderResult 统一支付接口返回的数据 * @ ...
- 源码安装mysql
1. 安装依赖组件 # yum install gcc gcc-c++ ncurses-devel perl -y 2. 安装cmake # wget http://www.cmake.org/f ...
- Hibernate总结3
一,对象的四种状态 临时状态: 与数据库没有对应,跟Session没有关联. 一般是新new出的对象. 持久化状态: 对象在Session的管理之中,最终会有对应的数据库记录.save saveoru ...