結果

問題 No.14 最小公倍数ソート
コンテスト
ユーザー なお
提出日時 2014-11-01 06:23:27
言語 C++11(old_compat)
(gcc 12.4.0 + boost 1.89.0)
コンパイル:
g++-12 -O2 -lm -std=gnu++11 -Wuninitialized -DONLINE_JUDGE -include bits/stdc++.h -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 45 ms / 5,000 ms
コード長 1,670 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,342 ms
コンパイル使用メモリ 177,764 KB
実行使用メモリ 9,344 KB
最終ジャッジ日時 2026-03-08 15:58:40
合計ジャッジ時間 2,515 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 20
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <cstring>
using namespace std;
#define REP(i, n)           for(int(i)=0;(i)<(n);++(i))
void rc(int v,int mn,int mx){if(v<mn||mx<v){cerr<<"error"<<endl;}}

vector<int> divis_list(unsigned int num){
    vector<int> divis_list;
    int rt = int(sqrt((double)num));
    for(int i = 1; i <= rt; i++){
        if(num % i == 0){
            divis_list.push_back(i);
            if(num / i != i) divis_list.push_back(num / i);
        }
    }
    return divis_list;
}

const int MAX = 10000;
int N, a[MAX+1];
vector<int> divs[MAX+1];
struct comp{ bool operator()(int i, int j){ return (a[i]!=a[j]) ? a[i]<a[j] : i<j; } };
set<int, comp> divsgrp[MAX+1];

int main(){
    do { cin.tie(0); ios_base::sync_with_stdio(false); } while(0);
    cin >> N; rc(N,1,10000);
    REP(i,N){
        cin >> a[i]; rc(a[i],1,10000);
        divs[i] = divis_list(a[i]);
        if(i > 0) for(auto &d : divs[i]) divsgrp[d].insert(i);
    }

    vector<int> result;
    int prev = 0;
    result.push_back(a[prev]);
    REP(i,N-1){
        int minval = 0, minidx = -1;
        for(auto &d : divs[prev]){
            if(divsgrp[d].empty()) continue;
            auto j = *divsgrp[d].begin();
            int cm = a[j] / d;
            if(minidx < 0 || minval > cm || (minval == cm && a[minidx] > a[j])){
                minval = cm, minidx = j;
            }
        }
        prev = minidx;
        result.push_back(a[prev]);
        for(auto &d : divs[prev]) divsgrp[d].erase(prev);
    }

    REP(i,N) cout << result[i] << (i==N-1?"\n":" ");
    return 0;
}
0