| 比赛 |
26暑假集训模拟赛1 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
光线追踪 |
最终得分 |
100 |
| 用户昵称 |
李金泽 |
运行时间 |
2.089 s |
| 代码语言 |
C++ |
内存使用 |
14.41 MiB |
| 提交时间 |
2026-06-29 11:47:47 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<utility>
#define N 100005
#define ls(x) x<<1
#define rs(x) x<<1|1
#define int long long
#define db double
#define mem(x) memset(x,0,sizeof(x))
#define fo(i,l,r) for(int i=l;i<=r;i++)
#define rf(i,r,l) for(int i=r;i>=l;i--)
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
struct fs{
int a,b;
bool operator<(fs y){return a*y.b<b*y.a;}
bool operator==(fs y){return a==y.a&&b==y.b;}
}b[N<<2],as[N];
fs make_fs(int a,int b){int d=gcd(a,b);a/=d;b/=d;return {a,b};}
int n,m,q,k,cnt,op,ans[N],x,y,z;
int t[N<<4];
const int inf=1e18;
struct node{int op,x[2],y[2];}a[N];
struct line{int x[2],y,i;}p[N*2];
void swap(int &x,int &y){int t=x;x=y;y=t;}
void swap(db &x,db &y){db t=x;x=y;y=t;}
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
void ckmax(int &x,int y){if(y>x)x=y;}
void ckmin(int &x,int y){if(y<x)x=y;}
int read(){
int sum=0;bool f=0;char c=getchar();
for(;c<48||c>57;c=getchar())if(c==45)f=1;
for(;c>=48&&c<=57;c=getchar())sum=sum*10+(c&15);
return f?-sum:sum;
}
void bd(int l,int r,int x){
t[x]=0;
if(l==r)return;
int mid=l+r>>1;
bd(l,mid,ls(x));bd(mid+1,r,rs(x));
}
void ad(int x,int k){
if(!t[x]||p[k].y<=p[t[x]].y)t[x]=k;
}
void pd(int x){
if(t[x]){
ad(ls(x),t[x]);
ad(rs(x),t[x]);
t[x]=0;
}
}
void ud(int l,int r,int sl,int sr,int x,int k){
if(sl<=l&&r<=sr){ad(x,k);return;}
pd(x);
int mid=l+r>>1;
if(sl<=mid)ud(l,mid,sl,sr,ls(x),k);
if(mid<sr)ud(mid+1,r,sl,sr,rs(x),k);
}
int gs(int l,int r,int s,int x){
if(l==r)return t[x];
pd(x);
int mid=l+r>>1;
if(s<=mid)return gs(l,mid,s,ls(x));
return gs(mid+1,r,s,rs(x));
}
int gs(int x,int y){
return lower_bound(b+1,b+m+1,make_fs(x,y))-b;
}
void solve(){
fo(i,1,q){
if(a[i].op==1){
if(!a[i].y[0])continue;
b[++m]=make_fs(a[i].x[0],a[i].y[0]);
b[++m]=make_fs(a[i].x[1],a[i].y[0]);
}
if(a[i].op==2)b[++m]=make_fs(a[i].x[0],a[i].y[0]);
}
sort(b+1,b+m+1);
m=unique(b+1,b+m+1)-b-1;
bd(1,m,1);
fo(i,1,q){
if(a[i].op==1){
if(!a[i].y[0])continue;
p[++n]={{gs(a[i].x[0],a[i].y[0]),gs(a[i].x[1],a[i].y[0])},a[i].y[0],i};
ud(1,m,p[n].x[0],p[n].x[1],1,n);
}
if(a[i].op==2){
int x=gs(1,m,gs(a[i].x[0],a[i].y[0]),1);
if(!x)continue;
if(ans[i]&&(as[i]<make_fs(p[x].y,1)||(as[i]==make_fs(p[x].y,1&&ans[i]>p[x].i))))continue;
ans[i]=p[x].i;as[i]=make_fs(p[x].y*a[i].x[0],a[i].y[0]);
}
}
}
signed main(){
freopen("raytracing.in","r",stdin);freopen("raytracing.out","w",stdout);
a[0]={0,{inf,inf},{inf,inf}};
q=read();
int ax=0,ay=0;
fo(i,1,q){
a[i].op=op=read();a[i].x[0]=read();a[i].y[0]=read();
if(op==1)a[i].x[1]=read(),a[i].y[1]=read();
if(!a[i].x[0]||!a[i].y[0]){
if(a[i].op==1){
if(!a[i].x[0])ax=a[i].y[0]<=a[ax].y[0]?i:ax;
if(!a[i].y[0])ay=a[i].x[0]<=a[ay].x[0]?i:ay;
}
if(a[i].op==2){
if(!a[i].x[0])ans[i]=ax;
if(!a[i].y[0])ans[i]=ay;
a[i].op=3;
}
}
}
solve();
fo(i,1,q)swap(a[i].x,a[i].y);
solve();
fo(i,1,q)
if(a[i].op==2||a[i].op==3)
printf("%lld\n",ans[i]);
return 0;
}