比赛 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;
}