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

注意到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. [LeetCode] Repeated Substring Pattern 重复子字符串模式

    Given a non-empty string check if it can be constructed by taking a substring of it and appending mu ...

  2. [LeetCode] Longest Consecutive Sequence 求最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  3. StringHelper

    /// <summary> /// 文本取左边 /// </summary> /// <param name="str"></param& ...

  4. HTTP相关函数

    1.headers_list() //返回头部信息 2.header("Content-type: text/html; charset=utf-8") //修改编码 3.head ...

  5. IO多路复用概念性

    sellect.poll.epoll三者的区别 先来了解一下什么是进程切换 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行,这种行为为进程的切换,任务切换 ...

  6. C#设计模式(2)——简单工厂模式

    一.概念:简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创 ...

  7. c# ros

    class MK { Stream connection; TcpClient con; public MK(string ip) { con = new TcpClient(); con.Conne ...

  8. ASP.NET web.config中的连接字符串

    在ASP.NET的web.config中,可以用两种方式来写连接字符串的配置. <configuration> <appSettings> <add key=" ...

  9. localForage——轻松实现 Web 离线存储(转)

    localStorage 能够让你实现基本的数据存储,但它的速度慢,而且不能处理二进制数据.IndexedDB 和 WebSQL 是异步的,速度快,支持大数据集,但他们的API 使用起来有点复杂.不仅 ...

  10. Unity 组件不常用知识备注

    Rigidbody(刚体) Interpolate:当物体进行不规则移动时,通过上一帧的行为来进行平滑移动 Extrapolate:通过推算下一帧的行为来进行平滑移动 PhysicMaterial(物 ...