比赛 26暑假集训模拟赛1 评测结果 AAAAAAAAAA
题目名称 光线追踪 最终得分 100
用户昵称 李金泽 运行时间 2.089 s
代码语言 C++ 内存使用 14.41 MiB
提交时间 2026-06-29 11:47:47
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<utility>
#define N 100005
#define ls(x) x<<1
#define rs(x) x<<1|1
#define int long long
#define db double
#define mem(x) memset(x,0,sizeof(x))
#define fo(i,l,r) for(int i=l;i<=r;i++)
#define rf(i,r,l) for(int i=r;i>=l;i--)
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
struct fs{
    int a,b;
    bool operator<(fs y){return a*y.b<b*y.a;}
    bool operator==(fs y){return a==y.a&&b==y.b;}
}b[N<<2],as[N];
fs make_fs(int a,int b){int d=gcd(a,b);a/=d;b/=d;return {a,b};}
int n,m,q,k,cnt,op,ans[N],x,y,z;
int t[N<<4];
const int inf=1e18;
struct node{int op,x[2],y[2];}a[N];
struct line{int x[2],y,i;}p[N*2];
void swap(int &x,int &y){int t=x;x=y;y=t;}
void swap(db &x,db &y){db t=x;x=y;y=t;}
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
void ckmax(int &x,int y){if(y>x)x=y;}
void ckmin(int &x,int y){if(y<x)x=y;}
int read(){
    int sum=0;bool f=0;char c=getchar();
    for(;c<48||c>57;c=getchar())if(c==45)f=1;
    for(;c>=48&&c<=57;c=getchar())sum=sum*10+(c&15);
    return f?-sum:sum;
}
void bd(int l,int r,int x){
    t[x]=0;
    if(l==r)return;
    int mid=l+r>>1;
    bd(l,mid,ls(x));bd(mid+1,r,rs(x));
}
void ad(int x,int k){
    if(!t[x]||p[k].y<=p[t[x]].y)t[x]=k;
}
void pd(int x){
    if(t[x]){
        ad(ls(x),t[x]);
        ad(rs(x),t[x]);
        t[x]=0;
    }
}
void ud(int l,int r,int sl,int sr,int x,int k){
    if(sl<=l&&r<=sr){ad(x,k);return;}
    pd(x);
    int mid=l+r>>1;
    if(sl<=mid)ud(l,mid,sl,sr,ls(x),k);
    if(mid<sr)ud(mid+1,r,sl,sr,rs(x),k);
}
int gs(int l,int r,int s,int x){
    if(l==r)return t[x];
    pd(x);
    int mid=l+r>>1;
    if(s<=mid)return gs(l,mid,s,ls(x));
    return gs(mid+1,r,s,rs(x));
}
int gs(int x,int y){
    return lower_bound(b+1,b+m+1,make_fs(x,y))-b;
}
void solve(){
    fo(i,1,q){
        if(a[i].op==1){
            if(!a[i].y[0])continue;
            b[++m]=make_fs(a[i].x[0],a[i].y[0]);
            b[++m]=make_fs(a[i].x[1],a[i].y[0]);
        }
        if(a[i].op==2)b[++m]=make_fs(a[i].x[0],a[i].y[0]);
    }
    sort(b+1,b+m+1);
    m=unique(b+1,b+m+1)-b-1;
    bd(1,m,1);
    fo(i,1,q){
        if(a[i].op==1){
            if(!a[i].y[0])continue;
            p[++n]={{gs(a[i].x[0],a[i].y[0]),gs(a[i].x[1],a[i].y[0])},a[i].y[0],i};
            ud(1,m,p[n].x[0],p[n].x[1],1,n);
        }
        if(a[i].op==2){
            int x=gs(1,m,gs(a[i].x[0],a[i].y[0]),1);
            if(!x)continue;
            if(ans[i]&&(as[i]<make_fs(p[x].y,1)||(as[i]==make_fs(p[x].y,1&&ans[i]>p[x].i))))continue;
            ans[i]=p[x].i;as[i]=make_fs(p[x].y*a[i].x[0],a[i].y[0]);
        }
    }
}
signed main(){
    freopen("raytracing.in","r",stdin);freopen("raytracing.out","w",stdout);
    a[0]={0,{inf,inf},{inf,inf}};
    q=read();
    int ax=0,ay=0;
    fo(i,1,q){
        a[i].op=op=read();a[i].x[0]=read();a[i].y[0]=read();
        if(op==1)a[i].x[1]=read(),a[i].y[1]=read();
        if(!a[i].x[0]||!a[i].y[0]){
            if(a[i].op==1){
                if(!a[i].x[0])ax=a[i].y[0]<=a[ax].y[0]?i:ax;
                if(!a[i].y[0])ay=a[i].x[0]<=a[ay].x[0]?i:ay;
            }
            if(a[i].op==2){
                if(!a[i].x[0])ans[i]=ax;
                if(!a[i].y[0])ans[i]=ay;
                a[i].op=3;
            }
        }
    }
    solve();
    fo(i,1,q)swap(a[i].x,a[i].y);
    solve();
    fo(i,1,q)
        if(a[i].op==2||a[i].op==3)
                printf("%lld\n",ans[i]);
    return 0;
}