比赛 26暑假集训模拟赛1 评测结果 AAATTTTTTT
题目名称 光线追踪 最终得分 30
用户昵称 ChenBp 运行时间 21.727 s
代码语言 C++ 内存使用 4.05 MiB
提交时间 2026-06-29 10:11:48
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const double eps=1e-7;
struct node{
    int x0,y0,x1,y1;
    int id;
}a[100005];
double dis(double x,double y){
    return sqrt(x*x+y*y);
}
int main(){
    freopen("raytracing.in","r",stdin);
    freopen("raytracing.out","w",stdout);
    int q,n=0,_=0;
    cin>>q;
    while(q--){
        _++;
        int op;
        cin>>op;
        if(op==1){
            n++;
            cin>>a[n].x0>>a[n].y0>>a[n].x1>>a[n].y1;
            a[n].id=_;
        }else{
            int x,y;
            cin>>x>>y;
            if(x==0){
                int ans=0,ay=1e9+7;
                for(int i=1;i<=n;i++){
                    if(a[i].x0==0&&a[i].y0<ay){
                        ans=i;
                        ay=a[i].y0;
                    }
                }
                cout<<a[ans].id<<endl;
            }else if(y==0){
                int ans=0,ax=1e9+7;
                for(int i=1;i<=n;i++){
                    if(a[i].y0==0&&a[i].x0<ax){
                        ans=i;
                        ax=a[i].x0;
                    }
                }
                cout<<a[ans].id<<endl;
            }else{
                int ansx=0,ansy=0;
                double ax=1e9+7,ay=1e9+7;
                for(int i=1;i<=n;i++){
                    double jx=x*1.0/y*a[i].y0;
                    if(a[i].x0<=jx&&jx<=a[i].x1&&(jx<ax||(jx==ax&&a[ansx].id<a[i].id))){
                        ansx=i;
                        ax=jx;
                    }
                    jx=x*1.0/y*a[i].y1;
                    if(a[i].x0<=jx&&jx<=a[i].x1&&(jx<ax||(jx==ax&&a[ansx].id<a[i].id))){
                        ansx=i;
                        ax=jx;
                    }
                    
                    double jy=y*1.0/x*a[i].x0;
                    if(a[i].y0<=jy&&jy<=a[i].y1&&(jy<ay||(jy==ay&&a[ansy].id<a[i].id))){
                        ansy=i;
                        ay=jy;
                    }
                    jy=y*1.0/x*a[i].x1;
                    if(a[i].y0<=jy&&jy<=a[i].y1&&(jy<ay||(jy==ay&&a[ansy].id<a[i].id))){
                        ansy=i;
                        ay=jy;
                    }
                }
                if(ansx==0&&ansy==0){
                    cout<<"0\n";
                }else if(ansx==0){
                    cout<<a[ansy].id<<endl; 
                }else if(ansy==0){
                    cout<<a[ansx].id<<endl;
                }else{
                    double dx=dis(ax,y*1.0/x*ax);
                    double dy=dis(x*1.0/y*ay,ay);
//                    cout<<"!"<<dx<<" "<<a[ansx].id<<" "<<ax<<endl;
//                    cout<<"!"<<dy<<" "<<a[ansy].id<<" "<<ay<<endl;
                    if(abs(dx-dy)<eps){
                        cout<<max(a[ansx].id,a[ansy].id)<<endl;
                    }else{
                        if(dx>dy) cout<<a[ansy].id<<endl;
                        else cout<<a[ansx].id<<endl;
                    }
                }
            }
        }
    }
    return 0;
}