Solid Geometry Homework

题目连接:

http://acm.hdu.edu.cn/showproblem.php?pid=5298

Description

Yellowstar is studying solid geometry recently,and today’s homework is about the space,plane and sphere.So he draw many planes and spheres in the draft paper.These infinite planes and (the surface of)spheres divides the whole drawing space(which can be considered as a infinite 3D-space) into many disjoint regions.Planes and spheres forms the borders of these regions,and they don’t belong to any regions.

Then he comes up with a crazy idea:color the whole space with crayons.He wants that one region has only one color,and two adjacent regions should be colored differently (“adjacent” means the area of two regions’ common borders is greater than zero).Unfortunately,he has only two crayons:a yellow one and a red one.

Yellowstar likes yellow very much,so he gives some coordinates.The regions these points belong to should be colored yellow.

Given positions of all the planes and spheres and the coordinates mentioned above.You should determine:Is there a way to satisfy all the requests?Yellowstar also gives some other coordinates.He wants to know which color they will be while all the requests are satisfied.

Input

The first line contains an integer T,denoting the number of the test cases.

For each test case, the first line contains 4 integers m,n,p and q, denoting the number of planes,spheres,points and queries.

Then m lines follows,each containing four integers a,b,c and d,denoting the linear equation(ax+by+cz+d=0) of this plane.|a|+|b|+|c|>0.

Then n lines follows,each containing four integers x,y,z and r,denoting the center coordinate(x,y,z) and radius of this sphere.

Then p lines follows, each containing three integers x,y,z,denoting point(x,y,z),the region it belongs to should be colored yellow.

Next q lines are queries.Each contains three integers x,y,z-the coordinate of this point.You need to output which color it will be.

T<=30,0<=m<=100,0<=n<=10,0<=p<=200,1<=q<=2000,|all given numbers|<=10^6,any two planes or spheres aren’t coincidence.No point lies on given planes or spheres.

There is a blank line before each case.

Output

For each case,if there is no such a coloring way to color the whole space and meet all the requests,print“Impossible”.

Otherwise,for each query,print a line.If the color of this point can be certainly inferred,print it(’Y’ for yellow or ’R’ for red);if not(both are possible),print”Both”.

Print a blank line between adjacent cases.

Sample Input

3

1 1 1 2

0 0 1 0

0 0 0 2

0 0 1

0 0 -1

0 0 4

1 1 2 1

0 0 1 0

0 0 0 2

0 0 1

0 0 -1

0 0 4

1 1 0 2

0 0 1 0

0 0 0 2

0 0 4

0 0 -1

Sample Output

R

R

Impossible

Both

Both

Hint

题意

在一个三维平面上有一堆平面,有一堆圆,然后这些玩意儿把平面切成了很多块。

然后每一块要么是红色,要么是黄色。

相邻的两块颜色不同。

现在已知p个点的颜色是黄色。

然后问你接下来q个点的颜色是啥。

题解:

首先其实这个空间的颜色分布已经被那p个点唯一确认了。

所以我们只要知道一个区域的颜色就好了。

因为只有两种颜色,判断一个点的颜色只要知道和这些圆的位置关系和这些平面的位置关系就好了。

然后这道题就结束了……

大概就是这样 喵。

代码

#include<bits/stdc++.h>
using namespace std; struct node
{
long long a,b,c,d;
}plane[120],circle[12],P[2005],P2[205]; int n,m,p,q; int check_plane(node A,node B)
{
return A.a*B.a+A.b*B.b+A.c*B.c+A.d>0?1:0;
} int check_cirle(node A,node B)
{
return (A.a-B.a)*(A.a-B.a)+(A.b-B.b)*(A.b-B.b)+(A.c-B.c)*(A.c-B.c)>A.d*A.d?1:0;
} int check(node a)
{
int ans = 0;
for(int i=0;i<m;i++)
ans^=check_plane(plane[i],a);
for(int i=0;i<n;i++)
ans^=check_cirle(circle[i],a);
return ans;
}
void solve()
{
scanf("%d%d%d%d",&m,&n,&p,&q);
for(int i=0;i<m;i++)
scanf("%lld%lld%lld%lld",&plane[i].a,&plane[i].b,&plane[i].c,&plane[i].d);
for(int i=0;i<n;i++)
scanf("%lld%lld%lld%lld",&circle[i].a,&circle[i].b,&circle[i].c,&circle[i].d);
if(p==0){
for(int i=0;i<q;i++)
{
scanf("%lld%lld%lld",&P[i].a,&P[i].b,&P[i].c);
printf("Both\n");
}
return;
}
for(int i=0;i<p;i++)
scanf("%lld%lld%lld",&P2[i].a,&P2[i].b,&P2[i].c);
for(int i=0;i<q;i++)
scanf("%lld%lld%lld",&P[i].a,&P[i].b,&P[i].c);
int flag = check(P2[0]);
for(int i=0;i<p;i++)
if(check(P2[i])^flag==1)
{
printf("Impossible\n");
return;
}
for(int i=0;i<q;i++)
{
if(check(P[i])^flag==1)
printf("R\n");
else
printf("Y\n");
}
}
int main()
{
int t;scanf("%d",&t);
while(t--)
{
solve();
if(t)puts("");
}
return 0;
}

最新文章

  1. SQL SERVER 数据库操作脚本
  2. SUI分页组件和avalon搞定ajax无刷新分页
  3. Nginx+lua环境搭建
  4. A CIRCULAR PROGRESSBAR STYLE USING AN ATTACHED VIEWMODEL
  5. 网站开发中必备的8个 jQuery 效果【附源码】
  6. Linux资源控制-CPU和内存【转】
  7. asp自动解析网页中的图片地址,并将其保存到本地服务器
  8. c语言冒泡排序,指针,数组
  9. 关于字符编码精简介绍 ANSI GB2312 UTF8 UNICODE
  10. python模块之re正则表达式
  11. 《代码的第一行——Android》封面诞生
  12. maven依赖本地宝
  13. Mac appium.dmg. Xcode Command Line Tools
  14. awk删除最后一个字符
  15. 深度学习与NLP简单应用
  16. Android WebView 打印 Console Log
  17. [转载]Tensorflow 的reduce_sum()函数的axis,keep_dim这些参数到底是什么意思?
  18. ABP框架系列之二十四:(Email-Sending-EF-电子邮件发送)
  19. java8学习的一点总结
  20. 天天生鲜 - App设计

热门文章

  1. redhat5.5 x64 安装oracle 11g
  2. MongoDB之python简单交互(三)
  3. python基础===map, reduce, filter的用法
  4. MySQL指定使用某个索引查询语句
  5. Python 类的名称空间和组合
  6. Mac OS X 编译android内核 error: elf.h: No such file or directory 的解决方法
  7. VirtualBox与Genymotion命令行启动
  8. 13.Python3标准库--互联网
  9. sql函数应用例子
  10. 前端html第三方登录集合,微信,微博,QQ