LOJ#2039. 「SHOI2015」激光发生器(计算几何)
题面
题解
如果我初中科学老师知道我有一天计算的时候入射角不等于反射角不知道会不会把我抓起来打一顿……
这题本质上就是个模拟,需要的芝士也就计蒜几盒的那点,不过注意细节很多,放到考场上只能看看绝对调不出来的那种
//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
int read(){
R int res,f=1;R char ch;
while((ch=getchar())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getchar())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=105;const double eps=1e-6,Pi=acos(-1.0),Loli=Pi*0.5;
inline double abs(R double x){return x<-eps?-x:x;}
inline int sgn(R double x){return x<-eps?-1:x>eps;}
struct node{
double x,y;
inline node(){}
inline node(R double xx,R double yy):x(xx),y(yy){}
inline node operator +(const node &b)const{return node(x+b.x,y+b.y);}
inline node operator -(const node &b)const{return node(x-b.x,y-b.y);}
inline double operator *(const node &b)const{return x*b.y-y*b.x;}
inline double operator ^(const node &b)const{return x*b.x+y*b.y;}
inline node operator *(const double &b)const{return node(x*b,y*b);}
inline double norm(){return sqrt(x*x+y*y);}
friend double ang(node &a,node &b){return acos((a^b)/a.norm()/b.norm());}//两个向量之间的夹角
inline node rot(const double &b){
//逆时针旋转b度
double s=sin(b),c=cos(b);
return node(x*c-y*s,x*s+y*c);
}
}p,v,c;
struct Line{
node p,v;
inline Line(){}
inline Line(R node a,R node b){p=a,v=b-a;}
friend node cross(const Line &a,const Line &b){return a.p+a.v*(b.v*(b.p-a.p)/(b.v*a.v));}//两直线交点
inline bool on(const node &b){return !sgn((b-p)*v)&&sgn((b-p)^(b-(p+v)))<0;}//判断点是否在线段上
}L[N];
int n,bt;double alf[N],x,y,xx,yy,a,b,bet;
int main(){
// freopen("testdata.in","r",stdin);
p.x=read(),p.y=read(),v.x=read(),v.y=read(),n=read();
fp(i,1,n){
x=read(),y=read(),xx=read(),yy=read(),a=read(),b=read();
L[i]=Line(node(x,y),node(xx,yy)),alf[i]=a/b;
}
bool flag=0;
fp(T,1,10){
double mn=1e18;int id=0;
fp(i,1,n)if(sgn(v*L[i].v)){
c=cross(Line(p,p+v),L[i]);
if(L[i].on(c)&&sgn(v^(c-p))>0&&cmin(mn,(c-p).norm()))id=i;
}
if(!id)break;
p=cross(Line(p,p+v),L[id]);
if(!sgn(v^L[id].v))v=v*-1;
else{
c=L[id].v;
if(sgn(c^v)<0)c=c*-1;
bet=Loli-ang(v,c),bt=sgn(c*v);
v=c.rot(bt*(bet*alf[id]-Loli));
}
printf("%d ",id),flag=1;
}
if(!flag)puts("NONE");
puts("");
return 0;
}
LOJ#2039. 「SHOI2015」激光发生器(计算几何)的更多相关文章
- [LOJ 2039] 「SHOI2015」激光发生器
[LOJ 2039] 「SHOI2015」激光发生器 链接 链接 题解 分为两个部分 第一个是求直线之间的交点找到第一个触碰到的镜面 第二个是求直线经过镜面反射之后的出射光线 第一个很好做,第二个就是 ...
- 【LOJ】#2039. 「SHOI2015」激光发生器
题解 我永远都写不对计算几何-- 首先找到反射的线段比较好找,扫一遍所有线段然后找交点在镜子上并且交点离起点最近的那条线段 然后旋转的时候,有可能是顺时针,也有可能是逆时针,要找出法线,然后判断法线和 ...
- loj#2038. 「SHOI2015」超能粒子炮・改
题目链接 loj#2038. 「SHOI2015」超能粒子炮・改 题解 卢卡斯定理 之后对于%p分类 剩下的是个子问题递归 n,k小于p的S可以预处理,C可以卢卡斯算 代码 #include<c ...
- loj #2037. 「SHOI2015」脑洞治疗仪
#2037. 「SHOI2015」脑洞治疗仪 题目描述 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪——一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见 ...
- Loj #2036. 「SHOI2015」自动刷题机
link : https://loj.ac/problem/2036 这个显然具有单调性,N小的话更容易A题,不仅因为A一次题减少的代码,并且A题的下限也低. 所以直接上二分就行了,注意上限一定不要设 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
随机推荐
- LINQPad 4 初次使用心得
最近学习EntityFramework,于是接触了LinqPad这款享誉已久的软件,深感相见恨晚.软件具体不多做介绍了,只简单介绍下使用方法. 数据库操作 添加数据库连接 1,首先通过点击Add co ...
- MyBatis 延迟加载 加载时机
- Mysql,重复字段只取其中一行
Mysql,重复字段只取其中一行 格式 : select 字段 from [表] where 其他字段 in (select 函数(其他字段) from [表] group by 相同字段) 示例如下 ...
- Jquery的树插件jqxTreeGrid的使用小结(实现基本的增删查改操作)
一.引入相应的js <link rel="stylesheet" href="../../jqwidgets/styles/jqx.base.css" t ...
- 自学PHP的野方法
1.基础知识 最早的基础知识仅限于那么一点点的html和css,比牛毛还牛毛的一点点.所以最开始是从immoc上看视频和跟着练习,花了有一个多月,看完一个路径从:零开始学习ThinkPHP框架,由于基 ...
- App启动页设计实例与技巧
App启动页,也称闪屏页,最初是为缓解用户等待Web/iOS/Android App数据加载的焦虑情绪而出现,后被设计师巧妙用于品牌文化展示,服务特色介绍以及功能界面熟悉等平台进行设计,被赋予了更加丰 ...
- winscp 使用root身份登录
参考: https://www.haiyun.me/archives/winscp-sftp-sudo-root.html 一般root账户在服务器上会被禁止ssh,此时普通用户通过sudo执行管理员 ...
- 不要怂,就是GAN (生成式对抗网络) (三):判别器和生成器 TensorFlow Model
在 /home/your_name/TensorFlow/DCGAN/ 下新建文件 utils.py,输入如下代码: import scipy.misc import numpy as np # 保存 ...
- Problem of Uninstall Cloudera: Cannot Add Hdfs and Reported Cannot Find CDH's bigtop-detect-javahome
1. Problem We wrote a shell script to uninstall Cloudera Manager(CM) that run in a cluster with 3 li ...
- 名字也挺重要---Webservice
整了几个WebService 方法的返回类型叫GetResponse ,GetDataResponse结果老报错,要加啥元素,加了也报错,后来把Get改成Retrive,运行就正常了,看来Get抢手 ...