| 比赛 |
26暑假集训模拟赛1 |
评测结果 |
WWWWWWWWWW |
| 题目名称 |
光线追踪 |
最终得分 |
0 |
| 用户昵称 |
2_16鸡扒拌面 |
运行时间 |
1.393 s |
| 代码语言 |
C++ |
内存使用 |
3.86 MiB |
| 提交时间 |
2026-06-29 10:57:55 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int q,op;
struct sq{
double xa,xb,ya,yb,k1,b1,k2,b2;
}squ[100010];
struct line{
double xa,xb,ya,yb,k,b;
}lin[100010];
void cal1(sq a)
{
a.k1=(a.yb-a.ya)/(a.xb-a.xa);
a.k2=(a.yb-a.ya)/(a.xa-a.xb);
a.b1=a.ya-a.xa*a.k1;
a.b2=a.yb-a.xa*a.k2;
}
void cal2(line a)
{
a.k=(a.yb-a.ya)/(a.xb-a.xa);
a.b=a.ya-a.xa*a.k;
}
pair<double,double> cal3(line a,sq b)
{
double xn1=(a.b-b.b1)/(b.k1-a.k); double yn1=a.k*xn1+a.b;
double xn2=(a.b-b.b2)/(b.k2-a.k); double yn2=a.k*xn2+a.b;
if(xn1>=b.xa&&xn1<=b.xb&&yn1>=b.ya&&yn1<=b.yb&&xn2>=b.xa&&xn2<=b.xb&&yn2>=b.ya&&yn2<=b.yb) return make_pair(min(xn1,xn2),min(yn1,yn2));//
else if(xn2>=b.xa&&xn2<=b.xb&&yn2>=b.ya&&yn2<=b.yb) return make_pair(xn2,yn2);
else if(xn1>=b.xa&&xn1<=b.xb&&yn1>=b.ya&&yn1<=b.yb) return make_pair(xn1,yn1);
else return make_pair(-1,-1);
}
int main()
{
freopen("raytracing.in","r",stdin);
freopen("raytracing.out","w",stdout);
cin>>q;
for(int i=1;i<=q;++i)
{
cin>>op;
int cntsqu=0,cntlin=0;
if(op==1)
{
cntsqu++;
cin>>squ[cntsqu].xa>>squ[cntsqu].ya>>squ[cntsqu].xb>>squ[cntsqu].yb;
cal1(squ[cntsqu]);
}
else
{
cntlin++;
cin>>lin[cntlin].xb>>lin[cntlin].yb;
lin[cntlin].xa=0; lin[cntlin].ya=0;
cal2(lin[cntlin]);
pair<double,double> min1=make_pair(10000000.0,10000000.0);
int ans=0;
for(int i=1;i<=cntsqu;++i)
{
pair<double,double> a1=cal3(lin[cntlin],squ[i]);
if(a1.first==-1) continue;
if(min1.first>=a1.first)
{
min1.first=a1.first;
min1.second=a1.second;
ans=i;
}
}
cout<<ans<<endl;
}
}
return 0;
}