[AGC064] A - i i's

[Q] https://atcoder.jp/contests/agc064/tasks/agc064_a

考察
・しれっとあるけど、先頭と末尾の要素も条件の対象。見落としそう。
1 <= |A[L] - A[1]| <= 2
・N=4のサンプルを活用しようと思う。

N=4
1 3 4 2 4 3 4 2 4 3

N=5は?
N=4にプラス1してみる。
2 4 5 3 5 4 5 3 5 4
ここに足りない値は、1,2,3,4,5。
これをいい感じに配置する。

A. (1) 2 4 5 3 5 4 5 3 5 4 (5 4 3 2)
1. 先頭に1を配置。
2. 末尾に下降系になるように、5 4 3 2をいい感じに配置。

N=6は?
N=5にプラス1してみる。
2 3 5 6 4 6 5 6 4 6 5 6 5 4 3
ここに足りない値は、1,2,3,4,5,6。いい感じに配置する。

A. (1) 2 3 5 6 4 6 5 6 4 6 5 6 5 4 3 (5 6 4 3 2)

O(N^3)だけどなんか間に合った。

実装

int main() {
  cincout();
  ll N;
  cin >> N;
 
  if (N == 3){
    cout << "1 3 2 3 2 3" << endl;
    return 0;
  }
  if (N == 4){
    cout << "1 3 4 2 4 3 4 2 4 3" << endl;
    return 0;
  }

  // N = 4 の形から、N = 5,6,...と広げていく。
  vector<ll> A = {1, 3, 4, 2, 4, 3, 4, 2, 4, 3};
  for(ll i = 5; i <= N; ++i){
    // 1,2,3,4,5が1個ずつ足りないはず。
    vector<ll> B;
    B.emplace_back(1); // 先頭に1
    rep(a, A.size()){
      B.emplace_back(A[a] + 1);
    }
    bool used[i + 1]{};
    // 上昇系
    ll a = B.back();
    while (a < i){
      ll na = min(i, a + 2);
      used[na] = true;
      B.emplace_back(na);
      a = na;
    }
    // 下降系
    for(; a >= 2; --a){
      if (used[a]) continue;
      B.emplace_back(a);
    }
    swap(A, B);
    auto debug=[&](){
      cerr << i << ": ";
      for(auto a : A) cerr << a << " ";
      cerr << endl;
    };
    // debug();
  }
  rep(i, A.size()) cout << A[i] << " \n"[i == A.size() - 1];
}

https://atcoder.jp/contests/agc064/submissions/44562255


いいなと思ったら応援しよう!