题面

传送门

题解

如果我初中科学老师知道我有一天计算的时候入射角不等于反射角不知道会不会把我抓起来打一顿……

这题本质上就是个模拟,需要的芝士也就计蒜几盒的那点,不过注意细节很多,放到考场上只能看看绝对调不出来的那种

//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」激光发生器(计算几何)的更多相关文章

  1. [LOJ 2039] 「SHOI2015」激光发生器

    [LOJ 2039] 「SHOI2015」激光发生器 链接 链接 题解 分为两个部分 第一个是求直线之间的交点找到第一个触碰到的镜面 第二个是求直线经过镜面反射之后的出射光线 第一个很好做,第二个就是 ...

  2. 【LOJ】#2039. 「SHOI2015」激光发生器

    题解 我永远都写不对计算几何-- 首先找到反射的线段比较好找,扫一遍所有线段然后找交点在镜子上并且交点离起点最近的那条线段 然后旋转的时候,有可能是顺时针,也有可能是逆时针,要找出法线,然后判断法线和 ...

  3. loj#2038. 「SHOI2015」超能粒子炮・改

    题目链接 loj#2038. 「SHOI2015」超能粒子炮・改 题解 卢卡斯定理 之后对于%p分类 剩下的是个子问题递归 n,k小于p的S可以预处理,C可以卢卡斯算 代码 #include<c ...

  4. loj #2037. 「SHOI2015」脑洞治疗仪

    #2037. 「SHOI2015」脑洞治疗仪   题目描述 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪——一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见 ...

  5. Loj #2036. 「SHOI2015」自动刷题机

    link : https://loj.ac/problem/2036 这个显然具有单调性,N小的话更容易A题,不仅因为A一次题减少的代码,并且A题的下限也低. 所以直接上二分就行了,注意上限一定不要设 ...

  6. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  7. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  8. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  9. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

随机推荐

  1. Linux-CentOS 更新Firefox版本

    1.用你本地的旧版 firefox,访问http://www.firefox.com.cn,下载Linux版本的Firefox. 2.进入存放下载文件(Firefox-latest-x86_64.ta ...

  2. 02-SSH综合案例:需求分析(后台)

    1.1.7  用户模块:(后台) 不用添加了,添加的话在前台就注册了. 查询所有用户: 修改用户信息: 删除用户信息: 1.1.8  一级分类:(后台) 主要都还是增删改查的操作 查询所有一级分类: ...

  3. unity shader tags

    "IgnoreProjector",值为"true"时,表示不接受Projector组件的投影. "ForceNoShadowCasting" ...

  4. for 续6

    ---------siwuxie095             for 实际运用样例(/f 的使用不列出来):     for %%i in (*) do echo %%i 显示当前目录下 ,所有非文 ...

  5. rabbitmq 和Spring 集成 实现(一)

    1.增加pom.xml依赖 <!--rabbitmq消息队列依赖架包--> <dependency> <groupId>org.springframework.am ...

  6. Windows c++程序的基本结构

    Windows c++程序的基本结构 1.一个完整的Windows应用程序通常由五种类型的文件组成 C语言源程序文件 头文件 模块定义文件 资源描述文件 项目文件 2.Windows应用程序构成基本框 ...

  7. ie8开发人员工具无法使用,按f12任务栏里出现任务,但是窗体不弹出

    楼主解决了么,刚出现你这样的问题,找了N久,终于解决了,他娘的,偏方啊任务栏不是出现那个箭头么,点击后没反应是吧在缩略图上点右键-最大化,然后就出来了,ctrl+p反正是可以出来调试模式 神人哪,IE ...

  8. 编译hadoop的libhdfs.a

    进入hadoop-hdfs-project/hadoop-hdfs/src目录,执行cmake以生成Makefile文件. 如果遇到如下的错误: ~/hadoop-2.7.1-src/hadoop-h ...

  9. UISearchDisplayController

    // // FirstViewController.swift // SearchDisplayDemo // // Created by Bruce Lee on 24/12/14. // Copy ...

  10. iOS隐藏导航条1px的底部横线

    第二种方法:1)声明UIImageView变量,存储底部横线 @implementation MyViewController { UIImageView *navBarHairlineImageVi ...