比赛 26暑假集训模拟赛1 评测结果 AAAWWWWWWW
题目名称 光线追踪 最终得分 30
用户昵称 zcx 运行时间 2.528 s
代码语言 C++ 内存使用 30.29 MiB
提交时间 2026-06-29 12:46:10
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
#define lson num * 2
#define rson num * 2 + 1
#define M ((L + R)>>1)
using namespace std;
const int N = 3e5 + 5;
const int INF = 1e9 + 2;
struct tree{
    int l,r,id;
    double tag;
} tr[2][N * 4];
int Q,tot = 0;

double q[N][5];
double b[N];

void build(int k,int num,int L,int R){
    tr[k][num].l = L;tr[k][num].r = R;tr[k][num].tag = INF,tr[k][num].id = 0;
    if(L == R) return;
    build(k,lson,L,M);build(k,rson,M + 1,R);
}

void co(int k,int num,double t,int d){
    if(tr[k][num].tag < t) return;
    tr[k][num].tag = t;
    tr[k][num].id = d;
}

void pushdown(int k,int num){
    co(k,lson,tr[k][num].tag,tr[k][num].id);
    co(k,rson,tr[k][num].tag,tr[k][num].id);
    tr[k][num].tag = INF;
    tr[k][num].id = 0;
}

void cover(int k,int num,int x,int y,double t,int d){
    if(tr[k][num].l >= x && tr[k][num].r <= y){
        co(k,num,t,d);
        return;
    }
    pushdown(k,num);
    int mid = tr[k][lson].r;
    if(x <= mid) cover(k,lson,x,y,t,d);
    if(y > mid) cover(k,rson,x,y,t,d);
}

double query(int k,int num,int x,int &d){
    if(tr[k][num].l == tr[k][num].r){
        d = tr[k][num].id;
        return tr[k][num].tag;
    }
    double ans;
    if(x <= tr[k][lson].r) ans = query(k,lson,x,d);
    else ans = query(k,rson,x,d);
    if(ans >= tr[k][num].tag){
        d = tr[k][num].id;
        ans = tr[k][num].tag;
    }
    return ans;
}

signed main()
{
    freopen("raytracing.in","r",stdin);
    freopen("raytracing.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0); 
    cin>>Q;
    for(int i = 1;i <= Q;i++){
        cin>>q[i][0];
        if(q[i][0] == 1){
            double x1,x2,y1,y2;
            cin>>x1>>y1>>x2>>y2;
            double u,v,w;
            if(!x2) u = INF;
            else u = y1 / x2;
            if(!x1) v = w = INF;
            else v=y1 / x1,w = y2 / x1;
            b[++tot] = u;b[++tot] = v;b[++tot] = w;
            q[i][1] = x1;q[i][2] = y1;q[i][3] = x2;q[i][4] = y2;
        }else{
            double x,y;
            cin>>x>>y;
            q[i][1] = x;q[i][2] = y;
            b[++tot] = (x? y / x:INF);
        }
    }
    int m = unique(b + 1,b + 1 + tot) - (b + 1);
    sort(b + 1,b + 1 + m);
    build(1,1,1,m);
    build(0,1,1,m);
    for(int i = 1;i <= Q;i++){
        if(q[i][0] == 1){
            int u = lower_bound(b + 1,b + 1 + m,(q[i][3]? q[i][2] / q[i][3] : INF)) - b;
            int v = lower_bound(b + 1,b + 1 + m,(q[i][1]? q[i][2] / q[i][1] : INF)) - b;
            int w = lower_bound(b + 1,b + 1 + m,(q[i][1]? q[i][4] / q[i][1] : INF)) - b;
            cover(0,1,u,v,q[i][2],i);
            cover(1,1,v,w,q[i][1],i);
        }else{
            int u = lower_bound(b + 1,b + 1 + m,(q[i][1]? q[i][2] / q[i][1] : INF)) - b;
            int xd,yd;
            double x = query(1,1,u,xd),y = query(0,1,u,yd);
            if(x * b[u] == y) cout<<max(xd,yd)<<endl;
            else if(x * b[u] < y) cout<<xd<<endl;
            else cout<<yd<<endl;
        }
    }
    return 0;
}