[Hip]デュプレステージキュー

7548 ワード

問題の説明

  • デュアル・ユーティリティ・プリアンブル・キューとは、次の演算が可能なデータ構造を意味します.
  • コマンド受信タワー(高さ)Iのデジタルキューに指定した数字を挿入します.D 1キューから最値を削除します.D-1キューから最大値を削除します.
  • のすべての演算を処理した後、キューが空の場合、[0,0]は[最大値、最大値]を返します.
  • 操作:デュアル優先順位キューで使用される演算
  • トラブルシューティング方法


    コード#コード#


    [2021.03.04]
    - priority_queue 사용
    #include <string>
    #include <vector>
    #include <queue>
    
    using namespace std;
    
    vector<int> solution(vector<string> operations) {
        int cnt = 0, num;
        priority_queue<int, vector<int>> decre;
        priority_queue<int, vector<int>, std::greater<int> > incre;
        
        for(int i = 0; i < operations.size(); i++) {
            num = stoi(operations[i].substr(2));
            
            switch(operations[i][0]) {
                case 'I':
                    decre.push(num);
                    incre.push(num);
                    break;
                case 'D':
                    bool size = (decre.size() - cnt) > 0;
                    if(num == 1 && size) {
                        decre.pop();
                    }
                    else if(num == -1 && size) {
                        incre.pop();
                        cnt++;
                    }
                    break;
            }
        }
        if(decre.size() - cnt == 0) return {0, 0};
        return {decre.top(), incre.top()};
    }
    #include <string>
    #include <vector>
    #include <queue>
    
    using namespace std;
    
    vector<int> solution(vector<string> operations) {
        int cnt = 0, num;
        priority_queue<int, vector<int>> decre;
        priority_queue<int, vector<int>, std::greater<int> > incre;
        
        for(int i = 0; i < operations.size(); i++) {
            num = stoi(operations[i].substr(2));
            switch(operations[i][0]) {
                case 'I':
                    decre.push(num);
                    incre.push(num);
                    break;
                case 'D':
                    bool size = (decre.size() - cnt) > 0;
                    if(num == 1 && size) {
                        decre.pop();
                    }
                    else if(num == -1 && size) {
                        incre.pop();
                        cnt++;
                    }
                    break;
            }
            if(decre.size() - cnt == 0) {
                priority_queue<int, vector<int>> tmp1;
                priority_queue<int, vector<int>, greater<int>> tmp2;
                decre.swap(tmp1);
                incre.swap(tmp2);
                cnt = 0;
            }
        }
        if(decre.size() - cnt == 0) return {0, 0};
        return {decre.top(), incre.top()};
    }

    [2021.03.05]
    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    vector<int> solution(vector<string> operations) {
        int cnt = 0, num;
        bool sorted = false;
        vector<int> nums;
        
        for(int i=0; i<operations.size(); i++) {
            num = stoi(operations[i].substr(2));
    
            if(operations[i][0] == 'D' && !nums.empty()) {
                if(sorted) sort(nums.begin(), nums.end());
                
                if(num == 1) {
                    nums.pop_back();
                } else {  
                    nums.erase(nums.begin());
                }
                sorted = false;
            }
            else if(operations[i][0] == 'I') {
                nums.push_back(num);
                sorted = true;
            }
        }
        if(nums.empty()) return {0, 0};
        return {nums.back(), nums.front()};
    }