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];
    }
    
}

 

posted on 2020-09-15 21:18  Hi!Superman  阅读(223)  评论(0编辑  收藏  举报

导航