競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 279E

ABC279E

\(0\)-indexed で考える. \(j \in M\) 番目を除いたものは, \([0,j) \) と \([j+1, M)\) に分解すると便利. 累積和などでも使われるが,今回も同様にできる.

あみだくじの上の方は,\(0\) の場所だけで十分. 下の方は,\([0, N)\) のすべての位置を持っておけば十分.

実装
下からシミュレーションする. 上からの様子は,前計算しておけば \(O(1)\) で答えられる.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main() {
  ll n, m ;
  cin >> n >> m;
  vll a(m); cinv(a);
  rep(i,m){
    a[i]--;
  }


  ll pos = 0; // position of 0
  vll f(m+1);  f[0] = pos;
  rep(i,m) {
    if(a[i] == pos) pos = a[i]+1;
    else if(a[i]+1 == pos) pos = a[i]; // if ではだめ. それだと,pos が2回更新されることがあるから.

    f[i+1] = pos; // i+1
  }

  vll p(n); rep(i,n) p[i] = i;
  vll ans;
  drep(i,m){ // rem : drep
    ans.push_back(p[f[i]]);

    swap(p[a[i]], p[a[i]+1]);
  }
 
  reverse(all(ans));
  for(ll i: ans) cout << i+1 << endl;
 
  return 0;
}