比赛 26暑假集训模拟赛1 评测结果 AAAAAAAAAA
题目名称 光线追踪 最终得分 100
用户昵称 郑霁桓 运行时间 1.649 s
代码语言 C++ 内存使用 13.15 MiB
提交时间 2026-06-29 10:54:31
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,t1[1000005],t2[1000005];
double op[100005],x[100005],y[100005],xx[100005],yy[100005];
vector<double>d;
void ad1(int tx,int ty,int l,int r,int p,int i){
    if(tx<=l&&r<=ty){
        if(x[t1[p]]>=x[i]) t1[p]=i;
        return;
    }
    int md=(l+r)>>1;
    if(t1[p]){
        if(x[t1[p*2]]>=x[t1[p]]) t1[p*2]=max(t1[p*2],t1[p]);
        if(x[t1[p*2+1]]>=x[t1[p]]) t1[p*2+1]=max(t1[p*2+1],t1[p]);
    }
    if(tx<=md) ad1(tx,ty,l,md,p*2,i);
    if(md+1<=ty) ad1(tx,ty,md+1,r,p*2+1,i);
    return;
}
int fd1(int tx,int l,int r,int p){
    if(l==r) return t1[p];
    int md=(l+r)>>1;
    if(t1[p]){
        if(x[t1[p*2]]>=x[t1[p]]) t1[p*2]=max(t1[p*2],t1[p]);
        if(x[t1[p*2+1]]>=x[t1[p]]) t1[p*2+1]=max(t1[p*2+1],t1[p]);
    }
    if(tx<=md) return fd1(tx,l,md,p*2);
    return fd1(tx,md+1,r,p*2+1);
}
void ad2(int tx,int ty,int l,int r,int p,int i){
    if(tx<=l&&r<=ty){
        if(y[t2[p]]>=y[i]) t2[p]=i;
        return;
    }
    int md=(l+r)>>1;
    if(t2[p]){
        if(y[t2[p*2]]>=y[t2[p]]) t2[p*2]=max(t2[p*2],t2[p]);
        if(y[t2[p*2+1]]>=y[t2[p]]) t2[p*2+1]=max(t2[p*2+1],t2[p]);
    }
    if(tx<=md) ad2(tx,ty,l,md,p*2,i);
    if(md+1<=ty) ad2(tx,ty,md+1,r,p*2+1,i);
    return;
}
int fd2(int tx,int l,int r,int p){
    if(l==r) return t2[p];
    int md=(l+r)>>1;
    if(t2[p]){
        if(y[t2[p*2]]>=y[t2[p]]) t2[p*2]=max(t2[p*2],t2[p]);
        if(y[t2[p*2+1]]>=y[t2[p]]) t2[p*2+1]=max(t2[p*2+1],t2[p]);
    }
    if(tx<=md) return fd2(tx,l,md,p*2);
    return fd2(tx,md+1,r,p*2+1);
}
int main(){
    freopen("raytracing.in","r",stdin);
    freopen("raytracing.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n,x[0]=y[0]=1e18;
    for(int i=1;i<=n;i++){
        cin>>op[i]>>x[i]>>y[i];
        if(op[i]==1){
            cin>>xx[i]>>yy[i];
            if(!x[i]) d.push_back(1e18);
            else d.push_back({y[i]/x[i]}),d.push_back(yy[i]/x[i]);
            if(!xx[i]) d.push_back(1e18);
            else d.push_back(y[i]/xx[i]);
        }else{
            if(!x[i]) d.push_back(1e18);
            else d.push_back(y[i]/x[i]);
        }
    }
    sort(d.begin(),d.end());
    int v=d.size();
    for(int i=1;i<=n;i++){
        int p1=lower_bound(d.begin(),d.end(),(x[i]?y[i]/x[i]:1e18))-d.begin()+1;
        if(op[i]==1){
            int p2=lower_bound(d.begin(),d.end(),(x[i]?yy[i]/x[i]:1e18))-d.begin()+1;
            ad1(p1,p2,1,v,1,i);
            p2=lower_bound(d.begin(),d.end(),(xx[i]?y[i]/xx[i]:1e18))-d.begin()+1;
            ad2(p2,p1,1,v,1,i);
        }else{
            int pp1=fd1(p1,1,v,1);
            int pp2=fd2(p1,1,v,1);
            if(!pp1) cout<<pp2<<"\n";
            else if(!pp2) cout<<pp1<<"\n";
            else if(pp1==pp2) cout<<pp1<<"\n";
            else{
                double px=y[pp2]*x[i]/y[i];
                double py=y[i]/x[i]*x[pp1];
                if(!y[i]) px=x[pp2];
                if(!x[i]) py=y[pp1];
                if(x[pp1]>px||y[pp2]<py) cout<<pp2<<"\n";
                else if(px>x[pp1]||py>y[pp2]) cout<<pp1<<"\n";
                else cout<<max(pp1,pp2)<<"\n";
            }
        }
    }
    return 0;
}
/*
3
1 21 0 40 55
1 48 0 73 71
2 91 0
*/