题解 | #涂颜料#

涂颜料

https://www.nowcoder.com/practice/4ef038ae1c5f4524b8a8a0c1e6b062a1

先将涂色区域按照left升序排序。因为left越小覆盖的范围越左。

随后,维护一个小顶堆,根据left判断是否加入这个涂色区域的pair。在小顶堆内,保持right最小的元素始终在顶部。当小顶堆顶部的pair已经不覆盖当前区域时,将其移除。

#include <algorithm>
#include <iostream>
#include <bits/stdc++.h>
#include <queue>
#include <vector>
using namespace std;

bool cmp(vector<int> l1, vector<int> l2){
    if(l1[0]<l2[0]) return true;
    else if(l1[0]==l2[0]){
        if(l1[1]<l2[1]) return true;
        else return false;
    }
    else {
        return false;
    }
}
struct cmp2{
    bool operator () (vector<int> l1, vector<int> l2){
        return l1[1] > l2[1];
    }
};
int main() {
    int n;
    cin>>n;
    int q;
    cin >> q;
    vector<vector<int>> list;
    while(q!=0){
        q--;
        int l, r;
        cin >> l >> r;
        list.push_back({l-1, r-1});
    }
    sort(list.begin(),list.end(), cmp);
    // queue<vector<int>> que;
    priority_queue<vector<int>, vector<vector<int>>, cmp2> que2;
    int cur = 0;
    for(int i=0;i<n;i++){
        while(cur<list.size()&&list[cur][0]<=i){
            que2.push(list[cur]);
            cur++;
        }
        while(!que2.empty()&&que2.top()[1]<i) que2.pop();
        if(que2.size()==0){
            cout<<"O";
        }
        else if(que2.size()%3==0){
            cout<<"B";
        }
        else if(que2.size()%3==1){
            cout<<"R";
        }
        else if(que2.size()%3==2){
            cout<<"G";
        }
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

🎓学历背景:双非土木硕👨‍💻意向职位:AI应用开发大佬们可以帮我看看简历吗,秋招至今0offer
秋招结束再玩瓦:今年科班都不好找哇……你可以试试交叉岗,比如制造业国企的一些开发算法,或者互联网的边缘岗,it技术支持,运维这些
我的简历长这样
点赞 评论 收藏
分享
10-19 00:57
门头沟学院 Java
我不是嘉心糖捏:我刚收到面试捏
投递360集团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务