比赛 26暑假集训模拟赛1 评测结果 AAAWWWEEEE
题目名称 光线追踪 最终得分 30
用户昵称 VTXE 运行时间 2.055 s
代码语言 C++ 内存使用 3.86 MiB
提交时间 2026-06-29 09:55:32
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define ll long long

struct node{
	ll x,y,xx,yy,id;
}t[11000];

ll Q;
ll vis[210][210];
ll cnt;

void solve1(){
	for (int ii=1;ii<=Q;ii++){
		ll op;
		cin>>op;
		if (op==1){
			ll x,y,xx,yy;
			cin>>x>>y>>xx>>yy;
			t[++cnt]={x,y,xx,yy,ii};
		}else{
			ll x,y;
			cin>>x>>y;
			double lt=1e9;
			ll ans=0;
			for (int i=1;i<=cnt;i++){
				double u1,v1=t[i].y,u2=t[i].x,v2;
				u1=v1*x/y;v2=u2*y/x;
				if (u1>=t[i].x&&u1<=t[i].xx){
					if (u1>lt) continue;
					lt=u1;
					ans=t[i].id;
				}else if (v2>=t[i].y&&v2<=t[i].yy){
					if (u2>lt) continue;
					lt=u2;
					ans=t[i].id;
				}
			}
			cout<<ans<<'\n';
		}
	}
}

void solve2(){
	for (int ii=1;ii<=Q;ii++){
		ll op;
		cin>>op;
		if (op==1){
			ll x,y,xx,yy;
			cin>>x>>y>>xx>>yy;
			for (int i=x+1;i<=xx;i++){
				for (int j=y+1;j<=yy;j++){
					vis[i][j]=ii;
				}
			}
		}else{
			ll x,y;
			cin>>x>>y;
			double u,v;
			ll a,b,c,d;
			ll ans=0;
			double lt;
			for (int i=1;i<=200;i++){
				u=i;v=u*y/x;
				a=v;
				if (a!=v){
					a++;
					if (vis[(ll)u+1][a]!=0){
						ans=vis[(ll)u+1][a];
						lt=u;
						break;
					}
					
				}else{
					if (vis[(ll)u][a+1]!=0){
						if (vis[(ll)u+1][a]!=0&&vis[(ll)u+1][a]>vis[(ll)u][a+1]){
							ans=vis[(ll)u+1][a];
						}else{
							ans=vis[(ll)u][a+1];
						}
						lt=u;
						break;
					}
				}
			}
			for (int i=1;i<=200;i++){
				v=i;u=v*x/y;
				if (u>lt) break;
				a=u;
				if (a!=u){
					a++;
					if (vis[a][(ll)v+1]!=0){
						ans=vis[a][(ll)v+1];
						break;
					}
				}else{
					if (vis[a][(ll)v+1]!=0){
						if (vis[a+1][(ll)v]!=0&&vis[a+1][(ll)v]>vis[a][(ll)v+1]){
							ans=vis[a+1][(ll)v];
						}else{
							ans=vis[a][(ll)v+1];
						}
						break;
					}
				}
			}
			cout<<ans<<'\n';
		}
	}
}

int main(){
	freopen("raytracing.in","r",stdin);
	freopen("raytracing.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>Q;
	if (Q<=1000) solve1();
	else solve2();
	
	return 0;
}