三维凸包裸题。

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的更多相关文章

  1. bzoj 1209: [HNOI2004]最佳包裹 三维凸包

    1209: [HNOI2004]最佳包裹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 160  Solved: 58[Submit][Status] ...

  2. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  3. 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 ...

  4. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  5. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  6. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  7. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  8. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

  9. 【清华集训】楼房重建 BZOJ 2957

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

随机推荐

  1. shell变量$#,$@,$0,$1,$2的含义

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  2. MVVM模式的 数据绑定

    数据绑定要达到的效果 数据绑定要达到什么效果呢,就是在界面中绑定了数据源之后,数据在界面上的修改能反映到绑定源,同时绑定源的修改也能反映到界面上.从界面反映到绑定的数据源是很容易理解的,因为在绑定过程 ...

  3. URIEncoding与useBodyEncodingForURI 在tomcat中文乱码处理上的区别

    大家知道tomcat5.0开始,对网页的中文字符的post或者get,经常会出现乱码现象. 具体是因为Tomcat默认是按ISO-8859-1进行URL解码,ISO-8859-1并未包括中文字符,这样 ...

  4. java基础29 迭代器 listIterator() 及各种遍历集合的方法

    listIterator() 迭代器包含了 Iterator() 迭代器中的所有方法. 1.ListIterator的常用方法 hasPrevious() :判断是否还有上一个元素,有则返回true  ...

  5. JS实现全选、反选、不选

    JS实现全选.反选.不选 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  6. Unix IPC之pipe

    pipe创建函数: #include <unistd.h> /* Create a one-way communication channel (pipe). If successful, ...

  7. CCF CSP 201503-4 网络延时

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-4 网络延时 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机 ...

  8. asp.net MVC发布iis无法加载css,js和图片

    今天真够郁闷的,遇到了在本地能运行的项目到了iis服务器那里就不行了,无法加载css,js和图片,这里说清楚一下先,关于asp.net 的MVC中这样的情况其实不少,但是之前遇到的是在visual s ...

  9. 跟我一起学WPF(2):WPF控件基础

    WPF控件简介 通过上一篇XAML语言的介绍,我们知道,XAML是一个树形结构,同样,WPF控件作为构成整个XAML树的一部分,也是一个树形结构.我们看一个简单的例子. <Button.Cont ...

  10. Ionic Js十四:浮动框

    $ionicPopover $ionicPopover 是一个可以浮在app内容上的一个视图框. 实例 HTML 代码 <p> <button ng-click="open ...