Official

B - Reverse Proxy Editorial by physics0523


\(X_i \ge 1\) である場合、箱 \(X_i\) にそのボールを入れます。

\(X_i = 0\) である場合、 for 文を用いることでどの箱にボールを入れるべきかを判定できます。
どの箱にボールを入れべきかが分かれば、後は \(X_i \ge 1\) である場合と同様の処理で箱にボールを入れればよいです。

\(X_i \ge 1\) であれば定数回の処理、 \(X_i = 0\) であれば \(O(N)\) 回程度の処理であるため、全体の時間計算量は \(O(NQ)\) となります。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int N,Q;
  cin >> N >> Q;
  vector<int> bk(N+1,0);
  for(int i=0;i<Q;i++){
    if(i){cout << " ";}

    int X;
    cin >> X;
    if(X>=1){
      bk[X]++;
      cout << X;
    }
    else{
      int y=1;
      for(int j=2;j<=N;j++){
        if(bk[y]>bk[j]){ y=j; }
      }
      bk[y]++;
      cout << y;
    }
  }
  cout << "\n";
  return 0;
}

Bonus! この問題を時間計算量 \(O(N+Q)\) で解いてみましょう。

posted:
last update: