| 比赛 |
26暑假集训模拟赛1 |
评测结果 |
AAATTTTTTT |
| 题目名称 |
光线追踪 |
最终得分 |
30 |
| 用户昵称 |
ChenBp |
运行时间 |
21.727 s |
| 代码语言 |
C++ |
内存使用 |
4.05 MiB |
| 提交时间 |
2026-06-29 10:11:48 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const double eps=1e-7;
struct node{
int x0,y0,x1,y1;
int id;
}a[100005];
double dis(double x,double y){
return sqrt(x*x+y*y);
}
int main(){
freopen("raytracing.in","r",stdin);
freopen("raytracing.out","w",stdout);
int q,n=0,_=0;
cin>>q;
while(q--){
_++;
int op;
cin>>op;
if(op==1){
n++;
cin>>a[n].x0>>a[n].y0>>a[n].x1>>a[n].y1;
a[n].id=_;
}else{
int x,y;
cin>>x>>y;
if(x==0){
int ans=0,ay=1e9+7;
for(int i=1;i<=n;i++){
if(a[i].x0==0&&a[i].y0<ay){
ans=i;
ay=a[i].y0;
}
}
cout<<a[ans].id<<endl;
}else if(y==0){
int ans=0,ax=1e9+7;
for(int i=1;i<=n;i++){
if(a[i].y0==0&&a[i].x0<ax){
ans=i;
ax=a[i].x0;
}
}
cout<<a[ans].id<<endl;
}else{
int ansx=0,ansy=0;
double ax=1e9+7,ay=1e9+7;
for(int i=1;i<=n;i++){
double jx=x*1.0/y*a[i].y0;
if(a[i].x0<=jx&&jx<=a[i].x1&&(jx<ax||(jx==ax&&a[ansx].id<a[i].id))){
ansx=i;
ax=jx;
}
jx=x*1.0/y*a[i].y1;
if(a[i].x0<=jx&&jx<=a[i].x1&&(jx<ax||(jx==ax&&a[ansx].id<a[i].id))){
ansx=i;
ax=jx;
}
double jy=y*1.0/x*a[i].x0;
if(a[i].y0<=jy&&jy<=a[i].y1&&(jy<ay||(jy==ay&&a[ansy].id<a[i].id))){
ansy=i;
ay=jy;
}
jy=y*1.0/x*a[i].x1;
if(a[i].y0<=jy&&jy<=a[i].y1&&(jy<ay||(jy==ay&&a[ansy].id<a[i].id))){
ansy=i;
ay=jy;
}
}
if(ansx==0&&ansy==0){
cout<<"0\n";
}else if(ansx==0){
cout<<a[ansy].id<<endl;
}else if(ansy==0){
cout<<a[ansx].id<<endl;
}else{
double dx=dis(ax,y*1.0/x*ax);
double dy=dis(x*1.0/y*ay,ay);
// cout<<"!"<<dx<<" "<<a[ansx].id<<" "<<ax<<endl;
// cout<<"!"<<dy<<" "<<a[ansy].id<<" "<<ay<<endl;
if(abs(dx-dy)<eps){
cout<<max(a[ansx].id,a[ansy].id)<<endl;
}else{
if(dx>dy) cout<<a[ansy].id<<endl;
else cout<<a[ansx].id<<endl;
}
}
}
}
}
return 0;
}