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