【Lintcode】Building Outline

class Solution {
public:
    /**
     * @param buildings: A list of lists of integers
     * @return: Find the outline of those buildings
     */
     
    set<int> loc;
    
    map<int,vector<int>> st,en;
    
    multiset<int> H;
    
    
    vector<vector<int>> buildingOutline(vector<vector<int>> &buildings) {
        // write your code here
        vector<vector<int>> ret;
        for (auto x : buildings)
        {
            loc.insert(x[0]);
            loc.insert(x[1]);
            st[x[0]].push_back(x[2]);
            en[x[1]].push_back(x[2]);
        }
        
        int H0 = 0;
        int X0 = 0;
        H.insert(0);
        for (auto X1 : loc)
        {
            auto H1 = *H.rbegin();
            if (H1)
            {
                if (ret.empty() || H1 != ret[ret.size() - 1][2])
                ret.push_back(vector<int>{X0,X1,H1});
                else ret[ret.size() - 1][1] = X1;
            }
            for (auto x : st[X1]) H.insert(x);
            for (auto x : en[X1]) H.erase(H.find(x));
            X0 = X1;
        }
        
        return ret;
    }
};

特别要注意,multiset删除某个元素的一个副本和所有副本的区别。

H.erase(x) 会删除 x 的所有副本

我不知道wa了一次嘿嘿,当然之前还ce了5,6次。。

转载于:https://www.cnblogs.com/soya/p/5202115.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值