bzoj4691: Let There Be Light
如果原点能被一个光源照到,那么这两个点之间一定没有任何球。我们可以通过三分距离来确定某线段和球是否有交点。
注意到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的更多相关文章
- CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection)
CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection) 2016-08-13 由于CSh ...
- 【MVVM Light】Messager的使用
一.前言 在MVVM编程的模式中,有时候我们会遇到一个很尴尬的情况: 若干个xaml.cs都复用一个ViewModel,当ViewModel想传递一个特定的消息给某一个xaml.cs的时候 ...
- 【MVVM Light】新手初识MVVM,你一看就会
一.前言 作为一个初入软件业的新手,各种设计模式与框架对我是眼花缭乱的.所以当我接触到这些新知识的时候就希望自己能总结几个步骤,以便更好更方便的在日常工作中进行使用. MVVM顾名思义就是Model- ...
- Sensor(LIGHT)
package com.example.sensor01; import java.util.List; import android.hardware.Sensor; import android. ...
- sourcesafe.light 开源项目启动
sourcesafe.light 源于一个2D独立砖块沙盒游戏. 在这个游戏的设计中碰到了一个瓶颈:这个游戏想把玩家变成一个个neo,在矩阵世界中没有什么不可以修改. 这个游戏要跨平台,玩家的修改操作 ...
- C#Light 和 uLua的对比第二弹
上次的对比大家还有印象否,C#Light和ulua对比各有胜负 今天我们加入一个去反射优化,这是uLua没办法实现的优化,我们也就只能不要脸的胜之不武了 以原生执行同一测试时间为X1,数字越小的越快 ...
- C#Light/Evil合体啦
决定将C#Light和C#Evil合并成一个项目,毕竟C#Evil包含C#Light所有的功能,分开两个,基本的表达式方面有什么bug还得两头改 暂时就C#Light/Evil这么叫吧,庆祝合体,画了 ...
- C#最良心脚本语言C#Light/Evil,Xamarin\WP8\Unity热更新最良心方案,再次进化.
C#Light的定位是嵌入式脚本语言,一段C#Light脚本是一个函数 C#Evil定位为书写项目的脚本语言,多脚本文件合作,可以完全用脚本承载项目. C#Light/Evil 使用完全C#一致性语法 ...
- C#Light 再推荐,顺便介绍WP8 功能展示项目
由于在项目中验证了C#Light脚本,C#Light的健壮和稳定程度已经得到了很大的提升. 现在可以更好的把C#Light介绍给大家使用,同时也有更多的自信,告诉大家这是一个已经具有商业价值的类库. ...
随机推荐
- Snowflake 全局唯一Id 生成
/// <summary> /// From: https://github.com/twitter/snowflake /// An object that generates IDs. ...
- 在Unity环境下使用抽象和接口
http://gamasutra.com/blogs/VictorBarcelo/20131217/207204/Using_abstractions_and_interfaces_with_Unit ...
- selector 使用说明
android:state_pressed=["true" | "false"]//是否触摸 android:state_focused=["true ...
- 基于bootstrap样式的tree,
<!doctype html><html lang="zh"><head> <meta charset="UTF-8" ...
- 搭建web框架手册(一)
昨天听完永康对EASYUI的介绍后终于明白了优秀的UI框架就是第一生产力,过去自己一直沉浸在后端代码中,完全忽视了前端的生产力交互,总觉得界面漂亮就是生产力,其实大错特错,真正的具有高效生产力的界面其 ...
- https简介/原理/部署【转】
转自: http://han.guokai.blog.163.com/blog/static/136718271201211631456811/ http://www.barretlee.com/bl ...
- 使用Amoeba for mysql实现mysql读写分离
Amoeba主要在应用层访问MySQL的时候充当query 路由功能,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明.具有负载均衡.高可用性.Qu ...
- 微博轻量级RPC框架Motan
Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用. ...
- Xcode 运行程序,左侧memory 不显示内存
运行程序后,xcode 不显示当前使用的内存情况,问题是打开了僵尸--enable zoombie Objects,关闭即可 打开 product--->SCheme-->EditSChe ...
- 用rose画UML图(用例图,活动图)
用rose画UML图(用例图,活动图) 首先,安装rose2003,电脑从win8升到win10以后,发现win10并不支持rose2003的安装,换了rose2007以后,发现也不可以. 解决途径: ...