【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=1;cas<=t;cas++){
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
		int ans=0,same=0;
		memset(ok,0,sizeof ok);
		memset(Dis,0,sizeof Dis);
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)mm[i].clear();
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			mm[i][dis(i,j)]++;
			if(mm[i][dis(i,j)]>1){ok[i]=1;break;}
		}
		for(int i=1;i<=n;i++)if(ok[i])
		for(int j=i+1;j<=n;j++)if(ok[j])
		for(int k=i+1;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+1;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*2);
	}
}

赛后做出来的,为什么当时暴力都写不出来呢,因为在防止多算的时候给漏算了。枚举出错。

时间: 2024-12-29 13:36:55

【HDU 5839】Special Tetrahedron(计算几何)的相关文章

hdu 5839 Special Tetrahedron 计算几何 求特殊四面体个数

Special Tetrahedron Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 175    Accepted Submission(s): 64 Problem Description Given n points which are in three-dimensional space(without repetition).

HDU 5839 Special Tetrahedron(计算几何)

传送门 Special Tetrahedron Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 616    Accepted Submission(s): 258 Problem Description Given n points which are in three-dimensional space(without repetit

HDU 5839 Special Tetrahedron (2016CCPC网络赛08) (暴力+剪枝)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5839 在一个三维坐标,给你n个点,问你有多少个四面体(4个点,6条边) 且满足至少四边相等 其余两边不相邻. 暴力4重循环,但是在第3重循环的时候需要判断是否是等腰三角形,这便是一个剪枝.在第4重循环的时候判断4点是否共面 (叉乘), 5或者6边相等就+1,4边相等就判断另外两边是否相交就行了. 赛后过的,觉得自己还是太菜了. 1 //#pragma comment(linker, "/STACK:

HDU 5839 Special Tetrahedron

暴力水过,数据水. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue>

hdu-5839 Special Tetrahedron(计算几何)

题目链接: Special Tetrahedron Time Limit: 4000/2000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description Given n points which are in three-dimensional space(without repetition). Please find out how many distinct Special Tetr

HDU 3395 Special Fish 最“大”费用最大流

求最大费用可以将边权取负以转化成求最小费用.然而此时依然不对,因为会优先寻找最大流,但是答案并不一定出现在满流的时候.所以要加一些边(下图中的红边)使其在答案出现时满流.设所有边的流量为1,花费如下图所示.显然最大花费是1001,而没有红边的情况下会得到3. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio>

HDU 4569 Special equations(数学推论)

题目 //想不出来,看了解题报告 /* 题意:给你一个最高幂为4的一元多项式,让你求出一个x使其结果模p*p为0. 题解:f(x)%(p*p)=0那么一定有f(x)%p=0,f(x)%p=0那么一定有f(x+p)%p=0. 所以我们可以开始从0到p枚举x,当f(x)%p=0,然后再从x到p*p枚举,不过每次都是+p,找到了输出即可,没有的话No solution! */ #include<stdio.h> int main() { int t,n; __int64 a[5],p; scanf(

HDU 4063 Aircraft(计算几何)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4063 Description You are playing a flying game. In the game, player controls an aircraft in a 2D-space. The mission is to drive the craft from starting point to terminal point. The craft needs wireless s

HDU 4569 Special equations(取模)

Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4569 Description Let f(x) = a nx n +...+ a 1x +a 0, in which a i (0 <= i <= n) are all known integers. We call f(x) 0 (mod