【THUSC2017】【LOJ2982】宇宙广播 计算几何 高斯消元
题目大意
有 \(n\) 个 \(n\) 维空间中的球,求这些球的所有公切面。
保证不会无解或有无穷多组解。
\(n\leq 10\)
题解
你可以认为这是一道传统题。
记公切面为 \(a_1x_1+a_2x_2+\cdots+ a_nx_n=d\),满足 \(\sum_ia_i^2=1\)。
一个点 \(x_1,x_2,\ldots,x_n\) 到这个面的距离为
\]
对于第 \(i\) 个球,有 \(\lvert\sum_{j}a_jx_{i,j}-d\rvert=r\)。
枚举所有 \(\lvert\sum_{j}a_jx_{i,j}-d\rvert\) 的符号,把绝对值符号去掉。
然后解方程解出 \(a_i=D_1d+D_2\),带进 \(\sum_ia_i^2=1\) 中解方程就可以解出 \(d\)。
时间复杂度:\(O(n^32^n)\)。
直接解方程可能会有奇怪情况,所以要把所有坐标偏移一个值。
代码
const ldb eps=1e-6;
ldb DELTA[]={0,0.235,0.3746,0.1246,0.2153,0.364,0.1253,0.6124,0.164,0.7543,0.35476};
int n;
ldb a[20][20];
ldb r[20];
ldb ans[2100][20][20];
ldb b[20][20];
ldb c[20][20];
ldb e[20];
int cnt;
void gao(ldb d)
{
for(int i=1;i<=n;i++)
e[i]=c[i][n+1]*d+c[i][n+2];
cnt++;
for(int i=1;i<=n;i++)
{
ldb s=0;
for(int j=1;j<=n;j++)
s+=a[i][j]*e[j];
s-=d;
for(int j=1;j<=n;j++)
ans[cnt][i][j]=a[i][j]-s*e[j];
}
}
void calc()
{
memcpy(c,b,sizeof b);
int flag=0;
for(int i=1;i<=n;i++)
{
int x=i;
for(int j=i;j<=n;j++)
if(fabs(c[j][i])>fabs(c[x][i]))
x=j;
if(fabs(c[x][i])<eps)
{
flag=1;
continue;
}
if(x!=i)
swap(c[x],c[i]);
ldb v=1/c[i][i];
for(int j=1;j<=n+2;j++)
c[i][j]*=v;
for(int j=1;j<=n;j++)
if(j!=i)
{
ldb v=c[j][i];
for(int k=1;k<=n+2;k++)
c[j][k]-=c[i][k]*v;
}
}
if(flag)
{
// ldb d;
// for(int i=1;i<=n;i++)
// if(!c[i][i])
// {
// if(flag)
// {
// }
// else
// {
// }
printf("error\n");
return;
}
ldb A=0,B=0,C=0;
for(int i=1;i<=n;i++)
{
A+=c[i][n+1]*c[i][n+1];
B+=2*c[i][n+1]*c[i][n+2];
C+=c[i][n+2]*c[i][n+2];
}
C-=1;
if(fabs(A)<eps)
{
if(fabs(B)<eps)
{
return;
}
ldb d=-C/B;
gao(d);
}
else
{
ldb delta=B*B-4*A*C;
if(delta<-eps)
return;
else
delta=max(delta,(ldb)0);
if(delta<eps)
{
ldb d=-B/(2*A);
gao(d);
}
else
{
ldb d1=(-B+sqrt(delta))/(2*A);
gao(d1);
ldb d2=(-B+sqrt(delta))/(2*A);
gao(d2);
}
}
}
void dfs(int x)
{
if(x>n)
{
calc();
return;
}
for(int i=1;i<=n;i++)
b[x][i]=a[x][i];
b[x][n+1]=1;
b[x][n+2]=r[x];
dfs(x+1);
if(fabs(r[x])<eps)
return;
b[x][n+2]=-r[x];
dfs(x+1);
}
void solve()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%Lf",&a[i][j]);
a[i][j]-=DELTA[j];
}
scanf("%Lf",&r[i]);
}
cnt=0;
dfs(1);
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
printf("%.20Lf ",ans[i][j][k]+DELTA[k]);
printf("\n");
}
}
int main()
{
// freopen("0.in","r",stdin);
int t;
scanf("%d",&t);
while(t--)
solve();
return 0;
}
【THUSC2017】【LOJ2982】宇宙广播 计算几何 高斯消元的更多相关文章
- 【THUSC2017】【LOJ2978】杜老师 高斯消元
题目大意 给你 \(l,r\),求从 \(l\) 到 \(r\) 这 \(r-l+1\) 个数中能选出多少个不同的子集,满足子集中所有的数的乘积是一个完全平方数. 对 \(998244353\) 取模 ...
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
- 【BZOJ-3270】博物馆 高斯消元 + 概率期望
3270: 博物馆 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 292 Solved: 158[Submit][Status][Discuss] ...
- *POJ 1222 高斯消元
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9612 Accepted: 62 ...
- [bzoj1013][JSOI2008][球形空间产生器sphere] (高斯消元)
Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...
- hihoCoder 1196 高斯消元·二
Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...
- BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基
[题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...
- SPOJ HIGH Highways ——Matrix-Tree定理 高斯消元
[题目分析] Matrix-Tree定理+高斯消元 求矩阵行列式的值,就可以得到生成树的个数. 至于证明,可以去看Vflea King(炸树狂魔)的博客 [代码] #include <cmath ...
- UVALive 7138 The Matrix Revolutions(Matrix-Tree + 高斯消元)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
随机推荐
- Linux通配符应用详解
一.强大的“*” “*”在通配符中是最常用的一种,代表0个.一个或多个字符.在使用中有三种情况,表示三种不同的含义. 1.单独的“*” 这里指的是只有“*”出现的情况,默认为单独的一个,当然连续敲两个 ...
- DSAPI Wifi热点的扫描与连接
使用DSAPI扫描和连接Wifi热点,支持连接隐藏的SSID. 效果演示: 代码如下: Private Wifi As New DSAPI.网络.Wifi Private Sub Button1_Cl ...
- Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式
一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...
- CSS中盒模型的理解
今天突然看到一篇关于CSS中盒模型的文章,忽然觉得自己竟然遗忘了很多小的地方,所以写一篇文章来记忆一下 (摘抄于千与千寻写的CSS盒子模型理解,并在自己基础上添加了一些东西,希望更完善,对大家有帮助) ...
- Android串口通讯
今天在整一个项目,需要利用串口通讯在网上看了好多人的帖子才稍微整出了一点头绪. 首先串口代码就是利用谷歌自己的api,将java代码放在java/android_serialport_api目录下,如 ...
- Java:配置环境(Mac)——MySQL
1.官网下载 2.双击开始安装,一直下一步 用旧版的密码加密 自己写个密码,最少8位 3.测试 打开系统偏好设置 4.mysql需要在系统环境变量里 1)在终端输入mysql,没有指令说明.此时就还不 ...
- Scrapy 框架流程详解
框架流程图 Scrapy 使用了 Twisted 异步非阻塞网络库来处理网络通讯,整体架构大致如下(绿线是数据流向): 简单叙述一下每层图的含义吧: Spiders(爬虫):它负责处理所有Respon ...
- 关于LeetCode上链表题目的一些trick
最近在刷leetcode上关于链表的一些高频题,在写代码的过程中总结了链表的一些解题技巧和常见题型. 结点的删除 指定链表中的某个结点,将其从链表中删除. 由于在链表中删除某个结点需要找到该结点的前一 ...
- hbase 工作原理
一.HBASE介绍HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建大规模结构化的存储集群.HBase的目标是存储并处理大型数据,具体 ...
- C#格式化
格式化表示的一般格式 { N [ , M ] [ :格式码 ] } N: 指定参数序列中的输出序号,比如{0} , {1}, {2}等. M: 指定参数输出的最小长度. 如果参数长度小于M,则空格填 ...