• 汕头市队赛 SRM1X T2 ——扫描线


    绵津见-终 SRM 13

    背景

            “西瓜也是可以种在海上的!”——绵津见

            然而种在海上的西瓜最需要防范的,是时不时会涌向瓜田的阵阵海浪。

            幸好,身为海神的绵津见可以释放魔法“水平如镜”来阻止海浪拍打西瓜。

            然而,当西瓜一个接一个成熟之时,它们就要离开瓜田,飘向遥远的彼岸。绵津见的魔法无法保护离开瓜田的西瓜们,但至少,也得知道西瓜们遭遇了多大的风浪啊。

    描述

            我们用一个坐标系来描述大海,绵津见的瓜田位于x轴下方,每当有一个西瓜成熟时,它会从x轴上一点出发,沿一条平行y轴的直线往y轴正方向前进。

            某个时刻,海上会有一个海浪生成。每个海浪都是一条平行于x轴的线段,并且会往y轴负方向前进。当它达到x轴下方时,它会受到“水平如镜”的影响而消失。

            所有西瓜、海浪每个时刻会前进一个单位距离,西瓜与西瓜之间,海浪与海浪之间互不影响,相互重叠的情况也是允许发生的。

            当一个西瓜与海浪重叠时,认定为该西瓜遭遇该海浪的拍打,西瓜与海浪的运动不受此次拍打的影响,原路前进。

            每个时刻的流程如下:

            ①在该时刻成熟的西瓜被摆放在x轴上,该时刻生成的海浪出现。

            ②进行一次判定操作:如果有西瓜和某海浪上的一点重合,判定为发生了一次拍打。

            ③所有西瓜前进一个单位距离,即y坐标加1。

            ④进行一次判定操作。

            ⑤所有海浪前进一个单位距离,即y坐标减1。y坐标为-1的海浪消失。

            你需要回答每个西瓜、每个海浪共涉及多少次拍打。

    输入格式

            第一行两个整数n,m表示西瓜的数量和海浪的数量。

            接下来n行,每行两个整数ti,xi描述一个西瓜,分别表示西瓜成熟的时间ti,成熟时出现在(xi,0)位置。

            接下来m行,每行四个整数Ti,li,ri,yi描述一个海浪,分别表示海浪生成的时间ti,生成时两个端点为(li,yi),(ri,yi)。

    输出格式

            输出第一行n个数,第i个数表示第i个西瓜被拍打的次数。

            输出第二行m个数,第i个数表示第i个海浪拍打到的西瓜数。

    样例输入 样例输出
    5 3
    2 3
    2 5
    2 6
    4 6
    4 7
    1 1 6 0
    2 1 6 0
    2 6 7 3
    1 1 2 1 1
    0 3 3

    数据范围与约定

            对于初:  1leq n,mleq 10^2,1leq t_i,T_i,x_ileq 10^3,0leq y_ileq 10^3

            对于续:  1leq n,mleq 10^3,1leq t_i,T_i,x_ileq 10^9,0leq y_ileq 10^9

            对于终:  1leq n,mleq 10^5,1leq t_i,T_i,x_ileq 10^9,0leq y_ileq 10^9

    样例解释

            ​不解释

    ————————————————————————————————————

    这道题分析之后 我们发现西瓜和海浪相碰需要满足

    设西瓜出发时间T1 位置x 海浪T2 l r 高度 y

    l<=x<=r  T2-y<=T1<=T2+y

    很明显这是符合扫描线的性质 所以我们可以将T排序 将 l x r 离散化一波

    将询问拆为两个 相减得到答案

    按T扫一波然后进行区间求和 因为点和矩阵相互影响是对称的

    所以询问和求和是相反的 这样就可以直接维护一波答案了

    代码简短但是略复杂 还是要花时间慢慢体会的

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int M=1e5+7;
    int read(){
        int ans=0,f=1,c=getchar();
        while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
        return ans*f;
    }
    int n,m;
    int xs[M*3],xp;
    int qp,ep;
    int s1[3*M],s2[3*M],ans1[M],ans2[M];
    int lowbit(int x){return x&-x;}
    void add(int x,int v,int s[]){
        while(x<=xp){
            s[x]+=v;
            x+=lowbit(x);
        }
    }
    int query(int x,int s[]){
        int ans=0;
        while(x){ans+=s[x]; x-=lowbit(x);}
        return ans;
    }
    struct Q{
        int l,r,y,id,s;
        bool operator <(const Q& h)const{return y<h.y;}
        void cal(){
            ans1[id]+=(query(r,s1)-query(l-1,s1))*s;
            add(l,-s,s2);
            add(r+1,s,s2);
        }
    }e[2*M];
    struct pos{
        int x,T,id;
        bool operator <(const pos& h)const{return T<h.T;}
        void cal(){
            add(x,1,s1);
            ans2[id]=query(x,s2);
        }
    }q[2*M];
    void $(int&x){x=lower_bound(xs,xs+xp,x)-xs+1;}
    int main()
    {
        int l,r,k,x;
        n=read(); m=read();
        for(int i=0;i<n;i++){
            k=read(); x=read();
            q[qp++]=(pos){xs[xp++]=x,k,i};
        }
        for(int i=0;i<m;i++){
            k=read(); l=read(); r=read(); x=read();
            e[ep++]=(Q){l,r,k-x-1,i,-1};
            e[ep++]=(Q){l,r,k+x,i,1};
            xs[xp++]=l;
            xs[xp++]=r;
        }
        sort(xs,xs+xp);
        for(int i=0;i<qp;++i)$(q[i].x);
        for(int i=0;i<ep;++i)$(e[i].l),$(e[i].r);
        sort(q,q+qp);
        sort(e,e+ep);
        for(int i=0,j=0;i<ep;i++){
            while(j<qp&&q[j].T<=e[i].y) q[j++].cal();
            e[i].cal();
        }
        for(int i=0;i<n;i++) printf("%d ",ans2[i]); printf("
    ");
        for(int i=0;i<m;i++) printf("%d ",ans1[i]); printf("
    ");
        return 0;
    }
    View Code
  • 相关阅读:
    DW吃瓜课程——机器学习理论知识笔记(四)
    DW吃瓜课程——机器学习理论知识笔记(三)
    DW吃瓜课程——机器学习理论知识笔记(二)
    DW吃瓜课程——机器学习理论知识笔记(一)
    DataWhale编程实践——区块链学习笔记
    CV入门系列笔记——全球人工智能技术创新大赛【热身赛】CV异常检测赛道
    强化学习入门笔记系列——DDPG算法
    强化学习入门笔记系列——稀疏奖赏和模仿学习
    强化学习入门笔记系列——DQN算法
    Java_SPI思想
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/7348160.html
Copyright © 2020-2023  润新知