Prefix K-th Max
問題
D – Prefix K-th Max
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2021/9/28 解法や実装が遅い。
- 2021/1/8 バーチャル参加。解法を思いつくのが遅い。
解法
- \(K\) 個になるまで
Priority Queue(昇順)
に入れると、top()
で \(K\) 番目に大きい値が取れる。 - それ以降は、
top()
と比較して、大きい場合はPriority Queue(昇順)
に入れる。小さい場合は追加しない。
コード例
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using P = pair<int, int>; #define rep(i, n) for(int i = 0; i < (n); ++i) // using mint = modint998244353; // using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 62; // const int INF = 1001001001; int main() { int N, K; cin >> N >> K; vector<int> P(N); rep(i, N) { cin >> P[i]; } priority_queue<int, vector<int>, greater<int>> que; int current = 0; rep(i, N) { if(i < K - 1) { que.push(P[i]); current = que.top(); } else if(i == K - 1) { que.push(P[i]); current = que.top(); cout << current << endl; } else { if(P[i] < current) { cout << current << endl; } else { que.pop(); que.push(P[i]); current = que.top(); cout << current << endl; } } } return 0; }