提出 #70707927


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;

constexpr int INF = 2002002002;

/////////////////// メイン ///////////////////

int main () {
  
  /////////////////// 前入力 ///////////////////
  
  int n;
  cin >> n;

  /////////////////// 前処理 ///////////////////

  // めっちゃ右とめっちゃ左(1e9以上離れた場所)で1人ずつ番兵をおく
  // 番兵の外側は自分自身としておくことで、番兵の距離が計算上常に0となる

  // 位置を記録
  vector<int> vx(n+3,0);

  // 自分の左右にいるメンバーを記録
  vector<int> vl(n+3,-1);
  vector<int> vr(n+3,-1);

  // 左右の距離の最小値
  vector<int> vd(n+3,0);

  // 初期状態(番兵2人)のデータを作る(0番はあとで追加する)
  vx.at(n+1) = -INF;
  vl.at(n+1) = n+1;
  vr.at(n+1) = n+2;
  vd.at(n+1) = 0;
  vx.at(n+2) = INF;
  vl.at(n+2) = n+1;
  vr.at(n+2) = n+2;
  vd.at(n+2) = 0;

  // メンバーの位置を検索する用のset
  set <pair<int,int>> st;
  st.emplace(-INF,n+1);
  st.emplace(INF,n+2);

  //////////////// 出力変数定義 ////////////////

  int result = 0;

  /////////////////// ループ ///////////////////

  // 0番から自分で入れる
  for (int i=0; i<=n; i++) {
    
    //////////////////// 入力 ////////////////////

    int x;
    if (i==0) x = 0;
    else cin >> x;

    //////////////// 出力変数定義 ////////////////



    //////////////////// 処理 ////////////////////

    // 位置を記録
    vx.at(i) = x;

    // 左右メンバーを検索してから、検索用データを更新
    auto it = st.upper_bound({x,0});
    int r = (*it).second;
    it--;
    int l = (*it).second;
    st.emplace(x,i);

    // 左右メンバーのデータを合計から一時削除
    result -= vd.at(l);
    result -= vd.at(r);

    // 左右関係を更新
    vr.at(l) = i;
    vl.at(i) = l;
    vl.at(r) = i;
    vr.at(i) = r;

    // 本人と左右について、距離情報を更新して合計に加算
    vector<int> tmp = {l,i,r};
    for (int j : tmp) {

      vd.at(j) = min(vx.at(j)-vx.at(vl.at(j)),vx.at(vr.at(j))-vx.at(j));
      result += vd.at(j);

    }

    //////////////////// 出力 ////////////////////

    if (i!=0) cout << result << endl;
    
  }

  /////////////////// 後処理 ///////////////////



  //////////////////// 終了 ////////////////////

  return 0;

}

提出情報

提出日時
問題 D - Neighbor Distance
ユーザ wightou
言語 C++23 (GCC 15.2.0)
得点 400
コード長 2510 Byte
結果 AC
実行時間 705 ms
メモリ 36944 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 400 / 400
結果
AC × 1
AC × 31
セット名 テストケース
Sample sample_01.txt
All sample_01.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt
ケース名 結果 実行時間 メモリ
sample_01.txt AC 1 ms 3460 KiB
test_01.txt AC 1 ms 3488 KiB
test_02.txt AC 1 ms 3484 KiB
test_03.txt AC 475 ms 36632 KiB
test_04.txt AC 478 ms 36648 KiB
test_05.txt AC 478 ms 36668 KiB
test_06.txt AC 477 ms 36824 KiB
test_07.txt AC 476 ms 36732 KiB
test_08.txt AC 478 ms 36820 KiB
test_09.txt AC 460 ms 36600 KiB
test_10.txt AC 458 ms 36620 KiB
test_11.txt AC 460 ms 36824 KiB
test_12.txt AC 457 ms 36796 KiB
test_13.txt AC 487 ms 36904 KiB
test_14.txt AC 490 ms 36924 KiB
test_15.txt AC 485 ms 36796 KiB
test_16.txt AC 492 ms 36848 KiB
test_17.txt AC 676 ms 36888 KiB
test_18.txt AC 678 ms 36900 KiB
test_19.txt AC 692 ms 36936 KiB
test_20.txt AC 672 ms 36940 KiB
test_21.txt AC 691 ms 36932 KiB
test_22.txt AC 675 ms 36912 KiB
test_23.txt AC 672 ms 36944 KiB
test_24.txt AC 698 ms 36888 KiB
test_25.txt AC 678 ms 36712 KiB
test_26.txt AC 681 ms 36892 KiB
test_27.txt AC 682 ms 36836 KiB
test_28.txt AC 688 ms 36792 KiB
test_29.txt AC 705 ms 36880 KiB
test_30.txt AC 689 ms 36900 KiB