csp 202206-4光线追踪 满分代码


#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<cmath>
#include<set>
using namespace std;
#define mp make_pair
#define ll long long
#define N 600023
ll read()
{
    ll f=1,x=0;
    char c=getchar();
    while(c>'9'||c<'0')
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=x*10+c-'0';
        c=getchar();
    }
    return f*x;
}
int m;
struct ques{
    int x1,x2,y1,y2;
    double a;
}q[N];
struct node{
    int pos,op;
    double a;
    bool operator < (const node A)const
    {
        return pos<A.pos;
    }
};
int senum;
set<node>se[N];
map<int,int>mh,ml;
void add(int pos,int x,int op,int whc,double ta)
{
    if(!whc)
    {
        if(!mh[pos]) mh[pos]=++senum;
        int now=mh[pos];
        se[now].insert(node{x,op,ta});
    }
    else
    {
        if(!ml[pos]) ml[pos]=++senum;
        int now=ml[pos];
        se[now].insert(node{x,op,ta});
    }
}
void del(int pos,int x,int whc)
{
    if(!whc)
    {
        int now=mh[pos];
        se[now].erase(node{x,0,0});
    }
    else
    {
        int now=ml[pos];
        se[now].erase(node{x,0,0});
    }
}
int main()
{
    //se[1].insert(node{1,0,0});
    //se[1].erase(node{1,2,0.5});
    //cout<<se[1].size()<<'\n';
  //  freopen("a.in","r",stdin);
    m=read();
    //if(m<=10000)
    for(int i=1;i<=m;++i)
    {
        int op=read();
        if(op==1)
        {
            q[i].x1=read(),q[i].y1=read(),q[i].x2=read(),q[i].y2=read();
            cin>>q[i].a;
            int tx=q[i].x2>q[i].x1?1:-1;
            int ty=q[i].y2>q[i].y1?1:-1;
            int nx=q[i].x1+tx,ny=q[i].y1+ty;
            while(nx!=q[i].x2)
            {
                add(nx,ny,tx==ty,0,q[i].a);
                add(ny,nx,tx==ty,1,q[i].a);
                nx+=tx;ny+=ty;
            }
        }
        if(op==2)
        {
            int id=read();
            int tx=q[id].x2>q[id].x1?1:-1;
            int ty=q[id].y2>q[id].y1?1:-1;
            int nx=q[id].x1+tx,ny=q[id].y1+ty;
            while(nx!=q[id].x2)
            {
                del(nx,ny,0);
                del(ny,nx,1);
                nx+=tx;ny+=ty;
            }
        }
        if(op==3)
        {
            int nx=read(),ny=read(),d=read();
            double I;
            cin>>I;
            int t=read();
            //if(I>1.1) return 0;
            //cout<<i<<"@str\n";
            while(1)
            {
               // cout<<nx<<" "<<ny<<" "<<d<<" "<<I<<"POS"<<'\n';
                bool flag=0;
                if(d==0)
                {
                    int now=ml[ny];
                    if(!now) flag=1;
                    else
                    {
                        auto it=se[now].upper_bound(node{nx,0,0});
                        if(it==se[now].end()) flag=1;
                        else
                        {
                            if(t<it->pos-nx) flag=1;
                            else
                            {
                                t-=it->pos-nx;
                                I*=it->a;
                                //cout<<I<<" "<<it->a<<"!!\n";
                                if(I<1.0)
                                {
                                    printf("0 0 0\n");
                                    break;
                                }
                                nx=it->pos;
                                if(it->op)  d=1;
                                else d=3;
                            }
                        }
                    }
                    if(flag)
                    {
                        cout<<nx+t<<" "<<ny<<" "<<(int)floor(I)<<'\n';
                        break;
                    }
                }

                else if(d==1)
                {
                    int now=mh[nx];
                    if(!now) flag=1;
                    else
                    {
                        auto it=se[now].upper_bound(node{ny,0,0});
                        if(it==se[now].end()) flag=1;
                        else
                        {
                            if(t<it->pos-ny) flag=1;
                            else
                            {
                                t-=it->pos-ny;
                                I*=it->a;
                                if(I<1.0)
                                {
                                    printf("0 0 0\n");
                                    break;
                                }
                                ny=it->pos;
                                if(it->op)  d=0;
                                else d=2;
                            }
                        }
                    }
                    if(flag)
                    {
                        cout<<nx<<" "<<ny+t<<" "<<(int)floor(I)<<'\n';
                        break;
                    }
                }

                else if(d==2)
                {
                    int now=ml[ny];
                    if(!now) flag=1;
                    else
                    {
                        auto it=se[now].lower_bound(node{nx,0,0});
                        if(it==se[now].begin()) flag=1;
                        else
                        {
                            it--;

                            if(t<nx-it->pos) flag=1;
                            else
                            {
                                t-=nx-it->pos;
                                I*=it->a;
                                if(I<1.0)
                                {
                                    printf("0 0 0\n");
                                    break;
                                }
                                nx=it->pos;
                                if(it->op)  d=3;
                                else d=1;
                            }
                        }
                    }
                    if(flag)
                    {
                        cout<<nx-t<<" "<<ny<<" "<<(int)floor(I)<<'\n';
                        break;
                    }
                }

                else
                {
                    int now=mh[nx];
                    if(!now) flag=1;
                    else
                    {
                        auto it=se[now].lower_bound(node{ny,0,0});
                        if(it==se[now].begin()) flag=1;
                        else
                        {
                            it--;

                            if(t<ny-it->pos) flag=1;
                            else
                            {
                                t-=ny-it->pos;
                                I*=it->a;
                                if(I<1.0)
                                {
                                    printf("0 0 0\n");
                                    break;
                                }
                                ny=it->pos;
                                if(it->op)  d=2;
                                else d=0;
                            }

                        }
                    }
                    if(flag)
                    {
                        cout<<nx<<" "<<ny-t<<" "<<(int)floor(I)<<'\n';
                        break;
                    }
                }
            }
        }
    }
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值