题解 | #涂颜料#

涂颜料

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")

全部评论

相关推荐

11-26 22:34
已编辑
重庆邮电大学 Java
快手 客户端开发 (n+5)k*16 公积金12
点赞 评论 收藏
分享
头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务