結果

問題 No.1170 Never Want to Walk
ユーザー Craft Boss
提出日時 2025-10-07 19:01:16
言語 JavaScript
(node v23.5.0)
結果
WA  
実行時間 -
コード長 3,376 bytes
コンパイル時間 342 ms
コンパイル使用メモリ 7,720 KB
実行使用メモリ 62,368 KB
最終ジャッジ日時 2025-10-07 19:01:26
合計ジャッジ時間 7,281 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1 WA * 1
other WA * 37
権限があれば一括ダウンロードができます

ソースコード

diff #

const N = 5;    // 駅数
const A = 4;    // 距離の下限
const B = 6;    // 距離の上限
const xi = [0, 2, 5, 7, 8]; // 駅の座標(昇順)

// --- メインロジック ---

// 連結成分(同じ線路グループ)を管理する二次元配列
// Python: linelist = [[xi[0]]]
let linelist = [[xi[0]]];

// 2番目以降の各駅についてループ
// Python: for i in range(1, N):
for (let i = 1; i < N; i++) {
  
  // Pythonのfor...else文を再現するためのフラグ
  let isConnected = false;

  // 現在の駅iより手前にある駅jをすべてチェック
  // Python: for j in range(i):
  for (let j = 0; j < i; j++) {
    const distance = xi[i] - xi[j];
    
    // 駅iと駅jが接続できるか判定
    // Python: if A <= xi[i]-xi[j] and xi[i]-xi[j] <= B:
    if (A <= distance && distance <= B) {
      
      // 接続先の駅jがどの線路グループに属しているか探す
      // Python: for k, sublist in enumerate(linelist): ...
      const k = linelist.findIndex(sublist => sublist.includes(xi[j]));
      
      // 駅iが、j以外の手前の駅(rest)とも接続するかチェックし、必要なら線路グループを統合する
      // Python: for rest in range(j+1, i): ...
      // (注: この部分は元コードのロジックが複雑なため、より安全なマージ方法で再現)
      let indicesToMerge = new Set([k]);
      for (let rest = j + 1; rest < i; rest++) {
        const restDistance = xi[i] - xi[rest];
        if (A <= restDistance && restDistance <= B) {
          const l = linelist.findIndex(sublist => sublist.includes(xi[rest]));
          if (l !== -1) {
            indicesToMerge.add(l);
          }
        }
      }

      // 複数のグループと接続する場合、それらを1つに統合する
      if (indicesToMerge.size > 1) {
        const mainIndex = Math.min(...indicesToMerge); // 統合先のグループ
        let mergedGroup = [];
        
        // 統合対象のグループをすべて mainIndex にまとめる
        const newLinelist = [];
        linelist.forEach((group, index) => {
          if (indicesToMerge.has(index)) {
            mergedGroup.push(...group);
          } else {
            newLinelist.push(group);
          }
        });
        
        newLinelist.splice(mainIndex, 0, mergedGroup); // 統合したグループを元の位置に挿入
        linelist = newLinelist;
      }
      
      // 最後に、現在の駅iを該当のグループに追加する
      const finalK = linelist.findIndex(sublist => sublist.includes(xi[j]));
      linelist[finalK].push(xi[i]);
      
      isConnected = true; // 接続されたことを記録
      break; // 駅iの接続先が1つ見つかったので、jのループを抜ける
    }
  }

  // ループを最後まで回っても接続先が見つからなかった場合
  // Python: for...else:
  if (!isConnected) {
    // 新しい線路グループとして追加
    linelist.push([xi[i]]);
  }
}


// --- 出力部分 ---

// 各駅について、所属するグループの駅の数を出力
// Python: for i in range(N): ...
for (let i = 0; i < N; i++) {
  // 駅xi[i]が含まれるグループを探す
  const component = linelist.find(sublist => sublist.includes(xi[i]));
  // グループの長さを出力
  console.log(component.length);
}
0