結果
| 問題 |
No.649 ここでちょっとQK!
|
| コンテスト | |
| ユーザー |
log_K
|
| 提出日時 | 2023-11-02 00:58:19 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 266 ms / 3,000 ms |
| コード長 | 2,358 bytes |
| コンパイル時間 | 2,097 ms |
| コンパイル使用メモリ | 202,172 KB |
| 最終ジャッジ日時 | 2025-02-17 17:16:52 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
ソースコード
#line 1 "verify/yuki-649.test.cpp"
#define PROBLEM "https://yukicoder.me/problems/no/649"
#line 1 "library/DataStructure/K-th_MultiSet.hpp"
#include <bits/stdc++.h>
using namespace std;
template<typename Data, typename Value = Data>
struct Kth_MultiSet{
using F = function<Value(Value, Data)>;
using G = function<bool(Data, Data)>;
private:
int __K;
multiset<Data> __P, __Q;
F __Add, __Sub;
G __Require;
Value __Sum;
void balance(){
while(__P.size() < __K && __Q.size()){
auto itr = __Q.begin();
__Sum = __Add(__Sum, *itr);
__P.insert(*itr);
__Q.erase(itr);
}
if(__P.empty() || __Q.empty()) return;
while(1){
auto si = --(__P.end());
auto li = __Q.begin();
Data sv = (*si), lv = (*li);
if(__Require(sv, lv)) break;
__Sum = __Add(__Sub(__Sum, sv), lv);
__P.erase(si), __Q.erase(li);
__P.insert(lv), __Q.insert(sv);
}
}
public:
Kth_MultiSet(int K,
F Add = [](Value x, Data y){return x + y;},
F Sub = [](Value x, Data y){return x - y;},
G Require = [](Data x, Data y){return x <= y;})
: __K(K), __Add(Add), __Sub(Sub), __Require(Require), __Sum(){}
void insert(Data data){
__Q.insert(data);
balance();
}
void erase(Data value){
auto itr = __P.find(value);
if(itr != __P.end()){
__Sum = __Sub(__Sum, value);
__P.erase(itr);
}
else{
assert(__Q.find(value) != __Q.end());
__Q.erase(__Q.find(value));
}
balance();
}
inline bool exist(){
return __P.size() == __K;
}
inline Data get(){
assert(exist());
return *(--(__P.end()));
}
inline Value sum(){
return __Sum;
}
};
#line 4 "verify/yuki-649.test.cpp"
int main(){
int Q, K; cin >> Q >> K;
Kth_MultiSet<long long> st(K);
while(Q--){
int query; cin >> query;
if(query == 1){
long long v; cin >> v;
st.insert(v);
}
else{
long long v = -1;
if(st.exist()){
v = st.get();
st.erase(v);
}
cout << v << endl;
}
}
}
log_K