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