1655-真ん中を言う.


質問する



に答える


2つの
  • 優先キューを使用して、問題を解決します.(Max, Min)
  • Maxの最大値を中心値とする
  • を実現
  • Max.size()=Min.size()はMaxを表し、そうでなければMinを表す.
  • Max.top()>Min.top()の場合、2つの値が交換されます.
  • の最初の2つのルールを使用すると、Max.top()は中心値を維持し続けます.
  • コード#コード#

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long ll;
    
    int main() {
        ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
    
        int n;
        cin >> n;
        priority_queue<int> Max, Min;
        for (int i = 0; i < n; i++) {
            int x;
            cin >> x;
            if (Max.size() == Min.size()) {
                Max.push(x);
            } else {
                Min.push(-x);
            }
            if (!Max.empty() && !Min.empty()) {
                int xx = Max.top();
                int yy = -Min.top();
                if (xx > yy) {
                    Max.pop();
                    Min.pop();
                    Max.push(yy);
                    Min.push(-xx);
                }
            }
            cout << Max.top() << '\n';
        }
    }