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栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
随机推荐
- popular short sentences
backward compatibility 向后兼容 archive 文档
- 【codeforces】【比赛题解】#915 Educational CF Round 36
虽然最近打了很多场CF,也涨了很多分,但是好久没写CF的题解了. 前几次刚刚紫名的CF,太伤感情了,一下子就掉下来了,不懂你们Div.1. 珂学的那场我只做了第一题……悲伤. 这次的Education ...
- go 切片练习
下列程序输出什么? package main import "fmt" func main() { var sa = make([]string, 5, 10) f ...
- Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux【转】
转自:http://www.cnblogs.com/LittleHann/p/4127096.html 目录 1. sys_call_table:系统调用表 2. 内核符号导出表:Kernel-Sym ...
- aarch64_g2
ghc-cryptonite-devel-0.21-1.fc26.aarch64.rpm 2017-02-28 01:28 3.1M fedora Mirroring Project ghc-css- ...
- java浅复制与深使用接口实现
1.浅复制与深复制概念⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复 ...
- c# 通过Windows服务启动外部程序
1. 新建一个Windows服务应用程序 创建项目——>Visual C# 左侧的"+"——>Windows ——>Windows 服务(右侧模板)——>输 ...
- arp命令 清arp表
平常删除arp都用arp-d.大量存在的时候 arp -n|awk '/^[1-9]/ {print arp -d $1}' | sh 清除所有arp表,以前用这个来清arp表貌会清空,没注意到存在i ...
- HDU 2476 String painter(区间DP+思维)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意:给你字符串A.B,每次操作可以将一段区间刷成任意字符,问最少需要几次操作可以使得字符串 ...
- 20155225 2016-2017-2 《Java程序设计》第六周学习总结
20155225 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 java的输入输出系统 在重新指定标准输入输出时不同: 重新指定标准输入为文档输入时,是这样 ...