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

注意到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. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  2. [LeetCode] Palindrome Permutation 回文全排列

    Given a string, determine if a permutation of the string could form a palindrome. For example," ...

  3. [LeetCode] Remove Duplicates from Sorted Array II 有序数组中去除重复项之二

    Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For exampl ...

  4. Sqlite3常用的插入方法及性能测试

    最近做到的项目涉及一个大数据量缓存重传,其中要用到的sqlite技术,把自己的学习心得整理了一下. SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中. ...

  5. bzoj 2434 阿狸的打字机 fail树的性质

    如果a串是另b串的后缀,那么在trie图上沿着b的fail指针走一定可以走到a串. 而a串在b串里出现多少次就是它是多少个前缀的后缀. 所以把fail边反向建树维护个dfs序就行了. 并不是很难... ...

  6. Jetson ARM SeetaFace编译

    SeetaFace简介 SeetaFace依赖于OpenCV,对于Tegra on Ubuntu,Nvidia提供libopencv4tegra并且可以使用Cuda加速. 准备工作 1.阅读OpenC ...

  7. Zabbix监控redis status

    概述 zabbix采用Trapper方式监控redis status 原理 redis-cli info命令得到redis服务器的统计信息,脚本对信息分两部分处理: (1)# Keyspace部分为Z ...

  8. bzoj 4016: [FJOI2014]最短路径树问题

    bzoj4016 最短路路径问题 Time Limit: 5 Sec Memory Limit: 512 MB Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点 ...

  9. ASP.NET Forms 身份验证

    ASP.NET Forms 身份验证 在开发过程中,我们需要做的事情包括: 1. 在 web.config 中设置 Forms 身份验证相关参数.2. 创建登录页. 登录页中的操作包括: 1. 验证用 ...

  10. 关于Nginx的一些优化(突破十万并发)

    nginx指令中的优化(配置文件) worker_processes 8; nginx进程数,建议按照cpu数目来指定,一般为它的倍数. worker_cpu_affinity 00000001 00 ...