bzoj 4595 激光发生器
bzoj 4595 激光发生器
- 光线为射线,每次找到与当前光线相交且距离最近的镜子,然后旋转光线.
- 直线,射线利用线上一点+方向向量的方式表示.旋转时,旋转中心作为线上一点不变,方向向量左乘旋转矩阵.
- 即逆时针转过 \(\theta\) 角,方向向量 \((x,y)\) 变为 \((cos\theta \cdot x-sin\theta \cdot y,sin\theta\cdot x+cos\theta\cdot y)\).
- 实现时特判较多,需注意细节.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
inline int read()
{
int x=0;
bool pos=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
pos=0;
for(;isdigit(ch);ch=getchar())
x=x*10+ch-'0';
return pos?x:-x;
}
const int MAXN=110;
const double eps=1e-8;
int dcmp(double x)
{
return fabs(x)<=eps?0:(x>0?1:-1);
}
struct v2{
double x,y;
v2(double x=0,double y=0):x(x),y(y) {}
v2 operator + (const v2 &rhs) const
{
return v2(x+rhs.x,y+rhs.y);
}
v2 operator / (const double &rhs) const
{
return v2(x/rhs,y/rhs);
}
v2 operator - (const v2 &rhs) const
{
return v2(x-rhs.x,y-rhs.y);
}
double operator * (const v2 &rhs) const
{
return x*rhs.y-y*rhs.x;
}
double modulus()
{
return sqrt(x*x+y*y);
}
};
#define point v2
#define vector v2
v2 rotate(v2 v,double rad)
{
return v2(v.x*cos(rad)-v.y*sin(rad),v.x*sin(rad)+v.y*cos(rad));
}
v2 inter(point p,vector v,point q,vector w)
{
v2 u=p-q;
double t=(w*u)/(v*w);
return p+v2(v.x*t,v.y*t);
}
double dot(v2 a,v2 b)
{
return a.x*b.x+a.y*b.y;
}
bool onseg(point p,point a1,point a2)
{
return dcmp((a1-p)*(a2-p))==0 && dcmp(dot(a1-p,a2-p))<0;
}
double angle(v2 a,v2 b)
{
return acos(fabs(dot(a,b)/a.modulus()/b.modulus()-eps));
}
struct mir{
v2 p1,p2;
double a,b;
}a[MAXN];
double x,y,dx,dy;
int n;
int main()
{
int cnt=0;
scanf("%lf%lf%lf%lf",&x,&y,&dx,&dy);
n=read();
for(int i=1;i<=n;++i)
scanf("%lf%lf%lf%lf%lf%lf",&a[i].p1.x,&a[i].p1.y,&a[i].p2.x,&a[i].p2.y,&a[i].a,&a[i].b);
point p(x,y);
vector v(dx,dy);
for(int T=1;T<=10;++T)
{
double mdis=1e100;
int id=0;
for(int i=1;i<=n;++i)
{
if(dcmp((a[i].p1-a[i].p2)*v)!=0)
{
point t=inter(a[i].p1,a[i].p2-a[i].p1,p,v);
if(onseg(t,a[i].p1,a[i].p2) && dcmp(dot(v,t-p))>0)
{
double dis=(p-t).modulus();
if(dis<mdis)
mdis=dis,id=i;
}
}
}
if(id==0)
break;
++cnt;
p=inter(a[id].p1,a[id].p2-a[id].p1,p,v);
if(dcmp(dot(a[id].p1-a[id].p2,v)==0))
v=v2(-v.x,-v.y);
else
{
vector t=a[id].p2-a[id].p1;
if(dcmp(dot(a[id].p1-a[id].p2,v)>0))
t=t/(-1);
double alpha=acos(-1)/2-angle(t,v);
int bt=dcmp(t*v);
v=rotate(t,bt*(alpha*a[id].a/a[id].b-acos(-1)/2));
}
printf("%d ",id);
}
if(!cnt)
puts("NONE");
return 0;
}
bzoj 4595 激光发生器的更多相关文章
- BZOJ 4595 SHOI2015 激光发生器 射线,线段,偏转
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4595 题意概述: 给出一条射线和N条线段,射线遇到线段会发生反射,令入射角alpha,出射 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
- 【清华集训】楼房重建 BZOJ 2957
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
随机推荐
- 编译binutil包报错 error: array type has incomplete element type extern const struct relax_type md_relax_table[];
安装lfs时编译binutils出错: ../../sources/binutils-2.15.91.0.2/gas/config/tc-i386.h:457:32: error: array typ ...
- Excel转化成DataTable实现:NPOI和OLEDb
使用两种方式实现的excel数据转化成DataSet,再结合前一篇的DataTable转化为实体,就可以解决excel到实体之间的转化. 代码如下: 首先定义一个接口: public interfac ...
- tp5搭建1
1.首先在wamp环境根目录下创建文件夹resource. 2.利用composer下载tp5框架 怎么利用composer下载tp5框架 根据tp5完全开发手册,composer下载你的tp5框架 ...
- 'webpack' 不是内部或外部命令解决办法以及npm配置
昨天在笔记本上安装webpack,按照教程下来,使用webpack命令行,报错:'webpack' 不是内部或外部命令,也不是可运行的程序 或批处理文件.网上有大量的配置方法与解决办法,找了好久才成功 ...
- mui app在线更新
一参考资料 二代码 HTML代码 CSS代码 JS代码 接口代码 一.参考资料 http://ask.dcloud.net.cn/article/182 二.代码 1. HTML代码 <div ...
- 使用HandleErrorAttribute处理异常
ASP.NET MVC 默认提供了一个异常过滤器HandleError特性,使用该特性可以极为方便的捕捉并处理控制器和操作抛出的异常,也可以将此特性注册为全局异常过滤器从而捕捉项目中的所有异常.如果想 ...
- linq 多条件join
var query=from a in db.A join b in db.B.Where(c=>c.num>3) on new {a.type ...
- 利用python3.x实现小爬虫下载贴吧内图片
Hi, I'm back. 寒假在家只有一台笔记本,也懒得把台式机上的键盘拆下来用,因此编程被我暂时搁置,转而在网易云课堂上学了一下Python.可惜的是云课堂的Python教程是基于Python ...
- mysql too many connections解决方法
MySQL提示“too many connections”的解决办法 今天生产服务器上的MySQL出现了一个不算太陌生的错误“Too many connections”.平常碰到这个问题,我基本上 ...
- nyoj998——欧拉+折半查找
Sum 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 给你一个数N,使得在1~N之间能够找到x使得x满足gcd( x , N ) >= M, 求解gcd( ...