| 比赛 |
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
*/