結果

問題 No.649 ここでちょっとQK!
コンテスト
ユーザー toyama
提出日時 2019-10-06 11:49:03
言語 C++14
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++14 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,994 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 732 ms
コンパイル使用メモリ 94,412 KB
最終ジャッジ日時 2026-04-25 17:07:25
合計ジャッジ時間 8,563 ms
ジャッジサーバーID
(参考情報)
judge2_0 / judge1_0
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
main.cpp: In member function 'void FindKth<T, Compare>::merge_with(FindKth<T, Compare>&)':
main.cpp:68:15: error: 'struct FindKth<T, Compare>' has no member named 'insert' [-Wtemplate-body]
   68 |             l.insert(r.find_lower());
      |               ^~~~~~

ソースコード

diff #
raw source code

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <functional>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cassert>
using namespace std;
using llong = long long;

//===
//#include <cassert>
template<typename T, typename Compare = function<bool(T, T)> >
struct FindKth {
    using Heap = priority_queue<T, vector<T>, Compare>;
    
    const int K;
    Heap maxh;
    Heap minh;
    
    FindKth (const int K, const Compare &cmp = less<T>()):
        K(K),
        maxh(cmp),
        minh([&cmp](auto l, auto r){ return cmp(r, l); })
    {};
    
    size_t size() { return maxh.size() + minh.size(); };
    bool empty() { return size() > 0 ? false : true; };
    
    void push(T &d){
        maxh.push(d);
        if (maxh.size() > K) {
            minh.push(maxh.top());
            maxh.pop();
        }
    };
    
    T find(){
        assert(maxh.size() == K);
        return maxh.top();
    };
    T find_lower(){
        assert(!empty());
        return maxh.top();
    };
    
    void pop() {
        assert(!empty());

        maxh.pop();
        if (!minh.empty()) {
            maxh.push(minh.top());
            minh.pop();
        }
    };
    
    void merge_with(FindKth &r) {
        FindKth &l = *this;
        if (l.size() < r.size()) swap(l, r);

        while (!r.empty()){
            l.insert(r.find_lower());
            r.pop();
        }
    };
};
//===

int yc649() {
    llong q, k;
    llong com, v;
    
    cin >> q >> k;

    FindKth<llong> st(k);

    while (q--) {
        cin >> com;

        if (com == 1) {
            cin >> v;
            st.push(v);
        }
        else {
            if (st.size() < k) {
                cout << -1 << endl;
            }
            else {
                cout << st.find() << endl;
                st.pop();
            }
        }
    }
    
    return 0;
}

int main() {
    return yc649();
}
0