• 99 掉落的方块(699)


    作者: Turbo时间限制: 1S章节: 线段树

    晚于: 2020-09-09 12:00:00后提交分数乘系数50%

    问题描述 :

    在无限长的数轴(即 x 轴)上,我们根据给定的顺序放置对应的正方形方块。

    第 i 个掉落的方块(positions[i] = (left, side_length))是正方形,其中 left 表示该方块最左边的点位置(positions[i][0]),side_length 表示该方块的边长(positions[i][1])。

    每个方块的底部边缘平行于数轴(即 x 轴),并且从一个比目前所有的落地方块更高的高度掉落而下。在上一个方块结束掉落,并保持静止后,才开始掉落新方块。

    方块的底边具有非常大的粘性,并将保持固定在它们所接触的任何长度表面上(无论是数轴还是其他方块)。邻接掉落的边不会过早地粘合在一起,因为只有底边才具有粘性。

    返回一个堆叠高度列表 ans 。每一个堆叠高度 ans[i] 表示在通过 positions[0], positions[1], ..., positions[i] 表示的方块掉落结束后,目前所有已经落稳的方块堆叠的最高高度。

    示例 1:

    输入: [[1, 2], [2, 3], [6, 1]]

    输出: [2, 5, 5]

    解释:

    第一个方块 positions[0] = [1, 2] 掉落:

    _aa

    _aa

    -------

    方块最大高度为 2 。

    图中,a表示被方块占住的区域,a前面的下划线表示空白区域。

    第二个方块 positions[1] = [2, 3] 掉落:

    __aaa

    __aaa

    __aaa

    _aa__

    _aa__

    --------------

    方块最大高度为5。

    大的方块保持在较小的方块的顶部,不论它的重心在哪里,因为方块的底部边缘有非常大的粘性。

    第三个方块 positions[1] = [6, 1] 掉落:

    __aaa

    __aaa

    __aaa

    _aa

    _aa___a

    -------------- 

    方块最大高度为5。

    因此,我们返回结果[2, 5, 5]。

    示例 2:

    输入: [[100, 100], [200, 100]]

    输出: [100, 100]

    解释: 相邻的方块不会过早地卡住,只有它们的底部边缘才能粘在表面上。

    输入说明 :

    首先输入方块的数目n

    然后输入n行,每行两个整数,表示方块的left和side_length

    1 <= n <= 1000.

    1 <= left <= 10^8.

    1 <= side_length <= 10^6.

    输出说明 :

    输出结果,共n个整数,

    第i个整数表示前i个方块堆叠的高度。

    整数之间以空格分隔。

    输入范例 :

    输出范例 :

    #include <iostream>
    #include <vector>
    #include <map>
    using namespace std;
    class Solution {
    public:
        vector<int> fallingSquares(vector<vector<int>>& pos) {
            vector<int> res(pos.size());
            int ind=0;
            int m_m=0;
            map<int,int> sp;
            for(auto &e:pos){
                int from=e[0],to=e[1]+from,len=e[1];
                int midh=0,endh=0;
                
                auto a=sp.lower_bound(from);
                if(a!=sp.begin()&&sp.find(from)==sp.end())--a;
                auto b=sp.lower_bound(to);
                if(b!=sp.begin()&&sp.find(to)==sp.end())--b;
                auto c=sp.upper_bound(to);
                
                auto d=sp.lower_bound(to);
                
                for(auto tmp=a;tmp!=d;++tmp)midh=max(midh,tmp->second);
                for(auto tmp=b;tmp!=c;++tmp)endh=tmp->second;
                
                sp.erase(sp.lower_bound(from),sp.upper_bound(to));
                sp[from]=midh+len;
                sp[to]=endh;
                
                m_m=max(m_m,midh+len);
                    
                res[ind++]=m_m;
                //for(auto &ele:sp)cout<<ele.first<<' '<<ele.second<<endl;
                //cout<<endl;
            }
            return res;
        }
    };
    int main()
    {
        int n,m;
        cin>>n;
        vector<vector<int>> buildings;
        for(int i=0;i<n;i++)
        {
            vector<int> row;
            for(int j=0;j<2;j++)
            {
                cin>>m;
                row.push_back(m);
            }
            buildings.push_back(row);
        }
        vector<int> res=Solution().fallingSquares(buildings);
        
        for(int i=0;i<res.size();i++)
        {
            if(i>0)
                cout<<" ";
            cout<<res[i];
        }
        
    }
  • 相关阅读:
    HUSTOJ搭建后为了方便作为Judger调用进行的一些修改操作
    [转]我国古代求解最大公约数的方法-更相减损术
    [转]nodejs导出word
    Java抓取Codeforces——针对某一次提交的源码和数据
    Java以UTF-8格式读写及追加写文件示例
    C++使用fill初始化二维数组
    FNV hash算法
    vitess基础镜像构建流程Centos
    go 工具链目前[不支持编译 windows 下的动态链接库]解决方案
    binlog分析方法
  • 原文地址:https://www.cnblogs.com/zmmm/p/13675721.html
Copyright © 2020-2023  润新知