如果原点能被一个光源照到,那么这两个点之间一定没有任何球。我们可以通过三分距离来确定某线段和球是否有交点。

注意到m非常小,于是我们可以枚举原点被哪些光源照到。由于\(O(3^{m}*n)\)会超时,我们可以对每个光源需要移走那些球进行压位。

复杂度\(O(3^{m}*n / w)\)

跑的有点慢啊……

#include <bits/stdc++.h>
#define UI unsigned int
#define N 2100
#define eps 0.000001
using namespace std;
int n, m, r;
struct node
{
double x, y, z;
} light[N], tar;
struct circle
{
node O; double r;
} ball[N];
double power[N];
void get(int t, int &d, int &u)
{
u = t >> ;
d = t ^ (u << );
}
double dist(node A, node B)
{
return pow(pow(A.x - B.x, ) + pow(A.y - B.y, ) + pow(A.z - B.z, ), 0.5);
}
node get(node A, node B, double d)
{
node nw;
nw.x = (B.x - A.x) * d + A.x;
nw.y = (B.y - A.y) * d + A.y;
nw.z = (B.z - A.z) * d + A.z;
return nw;
}
UI shel[][];
UI nowi[][];
int st[];
int ok[];
double ans;
int main()
{
for (int i = ; i < ( << ); ++ i)
for (int j = ; j < ; ++ j)
if (i & ( << j))
st[i] ++; while (scanf("%d%d%d", &n, &m, &r), n + m + r)
{
ans = ;
for (int i = ; i < n; ++ i)
scanf("%lf%lf%lf%lf", &ball[i].O.x, &ball[i].O.y, &ball[i].O.z, &ball[i].r);
for (int i = ; i < m; ++ i)
scanf("%lf%lf%lf%lf", &light[i].x, &light[i].y, &light[i].z, &power[i]);
scanf("%lf%lf%lf", &tar.x, &tar.y, &tar.z);
for (int i = ; i < m; ++ i) power[i] /= pow(dist(tar, light[i]), );
for (int i = ; i < m; ++ i)
for (int j = ; j < n / + ; ++ j)
shel[i][j] = ;
for (int i = ; i < m; ++ i)
for (int j = ; j < n; ++ j)
{
if (dist(ball[j].O, tar) < ball[j].r && dist(ball[j].O, light[i]) < ball[j].r) continue;
int d, u;
get(j, d, u);
double l = , r = ;
while (r - l > eps)
{
double m1 = (l + l + r) / , m2 = (l + r + r) / ;
node p1 = get(tar, light[i], m1), p2 = get(tar, light[i], m2);
if (dist(ball[j].O, p1) < dist(ball[j].O, p2))
{
if (dist(ball[j].O, p1) < ball[j].r) shel[i][u] |= << d;
r = m2;
}
else
{
if (dist(ball[j].O, p2) < ball[j].r) shel[i][u] |= << d;
l = m1;
}
}
}
for (int i = ; i < ( << m); ++ i)
{
ok[i] = ;
for (int j = ; ( << j) < i; j ++)
if (i & ( << j))
if (!ok[i ^ ( << j)]) ok[i] = ;
if (!ok[i]) continue;
for (int j = ; ( << j) <= i; j ++)
if (i & ( << j))
{
int s = ;
for (int k = ; k < n / + ; ++ k)
{
nowi[i][k] = nowi[i ^ ( << j)][k] | shel[j][k];
s += st[nowi[i][k] >> ] + st[nowi[i][k] ^ ((nowi[i][k] >> ) << )];
}
ok[i] = (s <= r);
break;
}
if (ok[i])
{
double nowans = ;
for (int j = ; j < m; ++ j)
if (i & ( << j)) nowans += power[j];
ans = max(ans, nowans);
}
}
printf("%.6lf\n", ans);
}
}

bzoj4691: Let There Be Light的更多相关文章

  1. CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection)

    CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection) 2016-08-13 由于CSh ...

  2. 【MVVM Light】Messager的使用

    一.前言       在MVVM编程的模式中,有时候我们会遇到一个很尴尬的情况: 若干个xaml.cs都复用一个ViewModel,当ViewModel想传递一个特定的消息给某一个xaml.cs的时候 ...

  3. 【MVVM Light】新手初识MVVM,你一看就会

    一.前言 作为一个初入软件业的新手,各种设计模式与框架对我是眼花缭乱的.所以当我接触到这些新知识的时候就希望自己能总结几个步骤,以便更好更方便的在日常工作中进行使用. MVVM顾名思义就是Model- ...

  4. Sensor(LIGHT)

    package com.example.sensor01; import java.util.List; import android.hardware.Sensor; import android. ...

  5. sourcesafe.light 开源项目启动

    sourcesafe.light 源于一个2D独立砖块沙盒游戏. 在这个游戏的设计中碰到了一个瓶颈:这个游戏想把玩家变成一个个neo,在矩阵世界中没有什么不可以修改. 这个游戏要跨平台,玩家的修改操作 ...

  6. C#Light 和 uLua的对比第二弹

    上次的对比大家还有印象否,C#Light和ulua对比各有胜负 今天我们加入一个去反射优化,这是uLua没办法实现的优化,我们也就只能不要脸的胜之不武了 以原生执行同一测试时间为X1,数字越小的越快 ...

  7. C#Light/Evil合体啦

    决定将C#Light和C#Evil合并成一个项目,毕竟C#Evil包含C#Light所有的功能,分开两个,基本的表达式方面有什么bug还得两头改 暂时就C#Light/Evil这么叫吧,庆祝合体,画了 ...

  8. C#最良心脚本语言C#Light/Evil,Xamarin\WP8\Unity热更新最良心方案,再次进化.

    C#Light的定位是嵌入式脚本语言,一段C#Light脚本是一个函数 C#Evil定位为书写项目的脚本语言,多脚本文件合作,可以完全用脚本承载项目. C#Light/Evil 使用完全C#一致性语法 ...

  9. C#Light 再推荐,顺便介绍WP8 功能展示项目

    由于在项目中验证了C#Light脚本,C#Light的健壮和稳定程度已经得到了很大的提升. 现在可以更好的把C#Light介绍给大家使用,同时也有更多的自信,告诉大家这是一个已经具有商业价值的类库. ...

随机推荐

  1. Unity中脚本的执行顺序总结(@WhiteTaken)

    (Editor)以上是Unity官方文档中的截图,脚本在被挂载到物体上,会启用Editor的方法Reset. (Initialization)当执行脚本开始,初始化的过程中,依次执行的是Awake-& ...

  2. [LeetCode] Gas Station 加油站问题

    There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...

  3. C++远征之封装篇(下)

    对象数组 类 x1[]; 栈中实例化,不用delete. 类 *X=new X[];//在堆中实例化,结尾需要用delete删除 delete []X; //这是数组的删除形式 X=NULL;

  4. 使用Xcode7的Instruments检测解决iOS内存泄露

    文/笨笨的糯糯(简书作者)原文链接:http://www.jianshu.com/p/0837331875f0著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 作为一名iOS开发攻城狮, ...

  5. BigDecimal 详细解析

    参加工作之后发现公司项目的数据库有关数值的字段类型,很少是之前常用的float和double, 而是一个没有接触过的decimal,在Java中表示的类型为BigDecimal, 而在业务中常常有关B ...

  6. 如何在sublime text上快速访问html页面?

    第一步.安装package control和安装sidebarenhancements插件 原来Subl3安装Package Control很麻烦,现在简单的方法来了 使用Ctrl+`快捷键或者通过V ...

  7. 北京培训记day4

    智商题QAQ-- T1:求>=n的最小素数,n<=10^18 暴力枚举n-n+100,miller-rabin筛法 T2:给定一个01矩阵,每次选择一个1并将(x,y)到(1,1)颜色反转 ...

  8. Linux CentOS6.x ip设置(网卡设置)

    修改IP永久生效按以下方法vi /etc/sysconfig/network-scripts/ifcfg-eth0(eth0,第一块网卡,如果是第二块则为eth1)按如下修改ip: DEVICE=et ...

  9. 自己写的服务出现"服务没有及时响应启动或控制请求 1053" 错误

    自己写了一个服务,安装到电脑上后 启动时发现报"服务没有及时响应启动或控制请求 1053" 这个错误 在网上找了一些方法,都没有解决 后来,看了下,原来有个写文件的方法读取文件没有 ...

  10. CSS-用伪类制作小箭头(轮播图的左右切换btn)

    先上学习地址:http://www.htmleaf.com/Demo/201610234136.html 作者对轮播图左右按钮的处理方法一改往常,不是简单地用btn.prev+btn.next的图片代 ...