HDU 4573 Throw the Stones(动态三维凸包)(2013 ACM-ICPC长沙赛区全国邀请赛)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4573
You believe it or not, anyway, I believed. Nowadays, some of the children are smarter than we were, while others may be more naughty.
A week ago, I saw several children throw stones. In fact, they are more clever than we were, since the game they played, apparently, is more complex than we did. Maybe you have different points of view, however, you’d better learn about the rules of the game before expressing your views. A group of children take turns to throw stones standing on the same position. After some child throw a stone, the children will draw a convex polyhedron with smallest volume together to enclose all the stones thrown by them. You may assume that the stone is so small as to be abstracted as a point in three-dimensional space. Naively, the children regard the space enclosed by the convex polyhedron as territory under their control. After a child throw his stone, the score he obtains equals the incremental of the volume of their territory. Unfortunately, the first three child’s score will always be zero. At last, the child with the highest score will win the game, and known as the "King".
I think you have accepted my opinion already, for the rules of their throwing stones game are really complicated. But, you also don’t need to be frustrated for it. Now, in order to show you are smarter, maybe you can write a program to help the children point out their "King".
Note: 1 <= N <= 10^4, 1 <= i <= N, -10^4 <= xi , yi , zi <= 10^4.
Please round the result to 2 digits after decimal point if necessary.
- #include <cstdio>
- #include <algorithm>
- #include <iostream>
- #include <cstring>
- #include <cmath>
- using namespace std;
- typedef long long LL;
- const int MAXN = ;
- const double EPS = 1e-;
- inline int sgn(double x) {
- return (x > EPS) - (x < -EPS);
- }
- struct Point {
- double x, y, z;
- Point() {}
- Point(double x, double y, double z): x(x), y(y), z(z) {}
- void read() {
- scanf("%lf%lf%lf", &x, &y, &z);
- }
- Point operator - (const Point &rhs) const {
- return Point(x - rhs.x, y - rhs.y, z - rhs.z);
- }
- double operator * (const Point &rhs) const {
- return x * rhs.x + y * rhs.y + z * rhs.z;
- }
- };
- double length(const Point &a) {
- return sqrt(a * a);
- }
- Point cross(const Point &a, const Point &b) {
- Point res;
- res.x = a.y * b.z - a.z * b.y;
- res.y = a.z * b.x - a.x * b.z;
- res.z = a.x * b.y - a.y * b.x;
- return res;
- }
- Point cross(const Point &o, const Point &a, const Point &b) {
- return cross(a - o, b - o);
- }
- double volume(const Point &a, const Point &b, const Point &c, const Point &d) {
- return cross(c - a , b - a) * (d - a) / ;
- }
- Point p[MAXN];
- struct Face {
- int a, b, c;
- bool flag;
- Face() {}
- Face(int a, int b, int c, bool flag): a(a), b(b), c(c), flag(flag) {}
- bool can_see(const Point &q) {
- return sgn(volume(p[a], p[b], p[c], q)) > ;
- }
- };
- Face fac[MAXN * ];
- struct Convex {
- double diff_vol;
- int cnt, mat[MAXN][MAXN];
- void init() {
- cnt = ;
- for(int i = ; i < ; ++i) {
- Face newf = Face((i + ) % , (i + ) % , (i + ) % , true);
- if(newf.can_see(p[i])) swap(newf.a, newf.c);
- mat[newf.a][newf.b] = mat[newf.b][newf.c] = mat[newf.c][newf.a] = cnt;
- fac[cnt++] = newf;
- }
- }
- void restore(int k, int a, int b) {
- int f = mat[a][b];
- if(fac[f].flag) {
- if(fac[f].can_see(p[k])) dfs(k, f);
- else {
- mat[b][a] = mat[a][k] = mat[k][b] = cnt;
- fac[cnt++] = Face(b, a, k, true);
- }
- }
- }
- void dfs(int k, int f) {
- diff_vol += volume(p[fac[f].a], p[fac[f].b], p[fac[f].c], p[k]);
- fac[f].flag = false;
- restore(k, fac[f].b, fac[f].a);
- restore(k, fac[f].c, fac[f].b);
- restore(k, fac[f].a, fac[f].c);
- }
- double update(int k) {
- diff_vol = ;
- for(int i = ; i < cnt; ++i) {
- if(!fac[i].flag || !fac[i].can_see(p[k])) continue;
- dfs(k, i);
- break;
- }
- return diff_vol;
- }
- double vol() {
- double res = ;
- for(int i = ; i < cnt; ++i) if(fac[i].flag)
- res -= volume(p[fac[i].a], p[fac[i].b], p[fac[i].c], Point(, , ));
- return res;
- }
- } solver;
- int n, kase;
- void solve() {
- int king = ;
- double maxans = ;
- for(int i = , tmp = ; i < n; ++i) {
- if(tmp == ) {
- tmp += sgn(length(p[] - p[i]));
- if(tmp > ) swap(p[], p[i]);
- } else if(tmp == ) {
- tmp += sgn(length(cross(p[], p[], p[i])));
- if(tmp > ) swap(p[], p[i]);
- } else if(tmp == ) {
- tmp += (sgn(volume(p[], p[], p[], p[i])) != );
- if(tmp > ) {
- swap(p[], p[i]);
- solver.init();
- for(int j = ; j <= i; ++j) solver.update(j);
- king = i, maxans = solver.vol();
- }
- } else {
- double v = solver.update(i);
- if(sgn(v - maxans) > ) {
- maxans = v;
- king = i;
- }
- }
- }
- printf("%d %.2f\n", king + , maxans);
- }
- int main() {
- while(scanf("%d", &n) != EOF) {
- for(int i = ; i < n; ++i) p[i].read();
- printf("Case #%d:\n", ++kase);
- solve();
- }
- }
HDU 4573 Throw the Stones(动态三维凸包)(2013 ACM-ICPC长沙赛区全国邀请赛)的更多相关文章
- HDU 4571 Travel in time ★(2013 ACM/ICPC长沙邀请赛)
[题意]给定N个点,每个点有一个停留所需的时间Ci,和停留能够获得的满意度Si,有M条边,每条边代表着两个点走动所需的时间ti,现在问在规定的T时间内从指定的一点S到E能够获得的最大的满意度是多少?要 ...
- HDU 4568 Hunter(最短路径+DP)(2013 ACM-ICPC长沙赛区全国邀请赛)
Problem Description One day, a hunter named James went to a mysterious area to find the treasures. J ...
- HDU 4747 Mex(线段树)(2013 ACM/ICPC Asia Regional Hangzhou Online)
Problem Description Mex is a function on a set of integers, which is universally used for impartial ...
- HDU 4582 DFS spanning tree(DFS+贪心)(2013ACM-ICPC杭州赛区全国邀请赛)
Problem Description Consider a Depth-First-Search(DFS) spanning tree T of a undirected connected gra ...
- HDU 4569 Special equations(枚举+数论)(2013 ACM-ICPC长沙赛区全国邀请赛)
Problem Description Let f(x) = anxn +...+ a1x +a0, in which ai (0 <= i <= n) are all known int ...
- HDU 4571 Travel in time(最短路径+DP)(2013 ACM-ICPC长沙赛区全国邀请赛)
Problem Description Bob gets tired of playing games, leaves Alice, and travels to Changsha alone. Yu ...
- HDU 4565 So Easy!(数学+矩阵快速幂)(2013 ACM-ICPC长沙赛区全国邀请赛)
Problem Description A sequence Sn is defined as:Where a, b, n, m are positive integers.┌x┐is the cei ...
- HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)
Friends and Enemies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- HDU 4063 Aircraft(计算几何)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4063 Description You are playing a flying game. In th ...
随机推荐
- 各个JSON技术的比较
JSON技术的调研报告 一 .各个JSON技术的简介和优劣1.json-libjson-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括com ...
- 解决父类加载iframe,src参数过大导致加载失败
原文:解决父类加载iframe,src参数过大导致加载失败 <iframe src="*******.do?param=****" id="leftFrame&qu ...
- ArcGIS Engine开发之旅05---空间数据库
原文:ArcGIS Engine开发之旅05---空间数据库 1 Geodatabase概念 Geodatabase是ArcInfo8引入的一种全新的面向对象的空间数据模型,是建立在DBMS之上的统 ...
- Android Keycode详解
用JAVA写appium的testcase时,想用Android自带的物理返回键,网上找了下分享给大家. import io.appium.java_client.android.AndroidKey ...
- Selenium2学习-003-WebUI自动化实战实例-001-百度搜索
此文主要通过百度搜索功能,进行 Selenium2 的实战实例讲解,文中所附源代码于 2015-01-16 02:01 亲测通过,敬请亲们阅览.希望能对初学 Selenium2 UI 自动化测试编程的 ...
- undefined reference to `switch_dev_unregister'
编译内核时,使用默认的配置进行编译.出现错误:undefined reference to switch_dev_unregister',undefined reference toswitch_se ...
- django 笔记
最近开始接触django,一些基本的操作记录于此. 参考链接: http://www.ziqiangxuetang.com/django/django-tutorial.html django安装 s ...
- .net中如何使用cookie
比如建立一个名为aspcn,值为灌水小鱼的cookie HttpCookie cookie = new HttpCookie["aspcn"];cookie.Value = &qu ...
- 缩进, Tab 还是空格?(转)
圣战 圣战个毛线 Android 好还是 iOS 好,Windows 好还是 Mac 好,编辑器好还是 IDE好,中划线好还是下划线好…写代码这么多年,会遇到很多奇葩的毫无意义的所谓脑残粉的争论 昨天 ...
- 这是我定位的Bug
https://github.com/danielgindi/ios-charts/issues/406