bzoj 1209
三维凸包裸题。
1、通过volume计算有向体积,判断点与面的位置关系。
2、噪声
/**************************************************************
Problem: 1209
User: idy002
Language: C++
Result: Accepted
Time:20 ms
Memory:1864 kb
****************************************************************/ #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#define eps 1e-10
#define N 1000
using namespace std; struct Vector {
double x, y, z;
void read() {
scanf( "%lf%lf%lf", &x, &y, &z );
}
Vector(){}
Vector( double x, double y, double z ):x(x),y(y),z(z){}
Vector operator+( const Vector &b ) const { return Vector(x+b.x,y+b.y,z+b.z); }
Vector operator-( const Vector &b ) const { return Vector(x-b.x,y-b.y,z-b.z); }
Vector operator*( double b ) const { return Vector(x*b,y*b,z*b); }
Vector operator/( double b ) const { return Vector(x/b,y/b,z/b); }
double operator&( const Vector &b ) const { return x*b.x+y*b.y+z*b.z; }
Vector operator^( const Vector &b ) const { return Vector(y*b.z-z*b.y,z*b.x-x*b.z,x*b.y-y*b.x); }
double len() { return sqrt(x*x+y*y+z*z); }
};
typedef Vector Point;
struct Face {
int p[];
Face(){}
Face( int a, int b, int c ) {
p[]=a, p[]=b, p[]=c;
}
};
typedef vector<Face> Convex; int n;
Point pts[N];
bool vis[N][N]; double rand01() {
return (double) rand()/RAND_MAX;
}
double randeps() {
return (rand01()-0.5)*eps;
}
void noise() {
for( int i=; i<n; i++ ) {
pts[i].x += randeps();
pts[i].y += randeps();
pts[i].z += randeps();
}
}
double volume( int p, int a, int b, int c ) {
return (pts[a]-pts[p])&((pts[b]-pts[a])^(pts[c]-pts[a]))/6.0;
}
bool cansee( Face &f, int p ) {
return volume(p,f.p[],f.p[],f.p[]) < 0.0;
}
Convex convex() {
static Point back[N];
for( int i=; i<n; i++ )
back[i] = pts[i];
noise(); int nt[] = { , , };
if( n<= ) return Convex(); Convex cur;
cur.push_back( Face(,,) );
cur.push_back( Face(,,) );
for( int i=; i<n; i++ ) {
Convex nxt;
for( int t=; t<cur.size(); t++ ) {
Face &f = cur[t];
bool see = cansee( f, i );
if( !see ) nxt.push_back(f);
for( int j=; j<; j++ )
vis[f.p[j]][f.p[nt[j]]] = see;
}
for( int t=; t<cur.size(); t++ ) {
Face &f = cur[t];
for( int j=; j<; j++ ) {
int a=f.p[j], b=f.p[nt[j]];
if( (vis[a][b]^vis[b][a]) && vis[a][b] )
nxt.push_back( Face(a,b,i) );
}
}
cur = nxt;
}
for( int i=; i<n; i++ )
pts[i] = back[i];
return cur;
}
void print( Convex &cvx ) {
fprintf( stderr, "%d\n", cvx.size() );
for( int t=; t<cvx.size(); t++ ) {
printf( "(%.0lf,%.0lf,%.0lf) (%.0lf,%.0lf,%.0lf) (%.0lf,%.0lf,%.0lf)\n",
pts[cvx[t].p[]].x, pts[cvx[t].p[]].y, pts[cvx[t].p[]].z,
pts[cvx[t].p[]].x, pts[cvx[t].p[]].y, pts[cvx[t].p[]].z,
pts[cvx[t].p[]].x, pts[cvx[t].p[]].y, pts[cvx[t].p[]].z );
}
}
double area( int a, int b, int c ) {
return ((pts[a]-pts[b])^(pts[a]-pts[c])).len() / 2.0;
} int main() {
scanf( "%d", &n );
for( int i=; i<n; i++ )
pts[i].read();
Convex cvx = convex(); // print( cvx ); double ans = 0.0;
for( int i=; i<cvx.size(); i++ )
ans += area( cvx[i].p[], cvx[i].p[], cvx[i].p[] );
printf( "%.6lf\n", ans );
}
bzoj 1209的更多相关文章
- bzoj 1209: [HNOI2004]最佳包裹 三维凸包
1209: [HNOI2004]最佳包裹 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 160 Solved: 58[Submit][Status] ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- Ural 1209. 1, 10, 100, 1000... 一道有趣的题
1209. 1, 10, 100, 1000... Time limit: 1.0 secondMemory limit: 64 MB Let's consider an infinite seque ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
- 【清华集训】楼房重建 BZOJ 2957
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
随机推荐
- CSS overscroll-behavior
overscroll-behavior新属性解决了在手机上弹出滚动的一些问题,具体内容查看网址:https://www.w3cplus.com/css/overscroll-behavior.html
- Linux嵌入式交叉编译环境 的搭建【转】
转自:http://blog.csdn.net/woaixiaozhe/article/details/7395435 1. 安装标准的C开发环境,由于Linux安装默认是不安装的,所以需要先安装一下 ...
- Cloud Lab: 泰晓实验云台【转】
转自:http://tinylab.org/cloud-lab/ 可快速构建的计算机课程在线实验平台 由 Wu Zhangjin 创建于 2017/10/06 评论 打赏 项目描述 泰晓实验云台 项目 ...
- MySQL分布式集群之MyCAT(三)rule的分析【转】
首先写在最前面,MyCAT1.4的alpha版本已经发布了,这里面修复了不少的bug,也完善了一细节,之前两篇博客已经做了一些修改 ---------------------------------- ...
- static, const 和 static const 变量的初始化问题
const 常量的在超出其作用域的时候会被释放,但是 static 静态变量在其作用域之外并没有释放,只是不能访问. static 修饰的是静态变量,静态函数.对于类来说,静态成员和静态函数是属于整个 ...
- Django 2.0.3安装-压缩包方式
OS:Windows 10家庭中文版,CPU:Intel Core i5-8250U Python版本:Python 2.7,Python 3.6 Django版本:2.0.3(最新2.0.5) 解压 ...
- Shell脚本系列教程二: 开始Shell编程
Shell脚本系列教程二: 开始Shell编程 2.1 如何写shell script? (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器; (2) ...
- day03作业
---恢复内容开始--- 1.+.-.*./.%.++.-- ①正号:②加法运算:③连接符 除法是两个数相除所得的结果,取余是除法操作的余数. ++前置表示现将一个数自加然后进行赋值,++后置表示先赋 ...
- web项目引入extjs小例子
一个新的项目,前端用extjs实现!分享一下extjs开发的准备工作! 首先去下载extjs的资源包,这里我是随便在网上下载的! 打开之后 ,目录是这样的! 需要关注的几个文件夹: builds:压缩 ...
- C#socket编程序(一)
在讲socket编程之前,我们先看一下最常用的一些类和方法,相信这些能让你事半功倍. 一.IP地址操作类 1.IPaddress类 a.在该类中有一个 parse()方法,能够把点分十进制IP地址 转 ...