結果
問題 | No.5007 Steiner Space Travel |
ユーザー | hotpepsi |
提出日時 | 2023-04-29 01:05:43 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 12 ms / 1,000 ms |
コード長 | 3,147 bytes |
コンパイル時間 | 1,487 ms |
コンパイル使用メモリ | 116,384 KB |
実行使用メモリ | 4,372 KB |
スコア | 6,664,248 |
最終ジャッジ日時 | 2023-04-29 01:05:47 |
合計ジャッジ時間 | 3,709 ms |
ジャッジサーバーID (参考情報) |
judge14 / judge11 |
純コード判定しない問題か言語 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 11 ms
4,372 KB |
testcase_01 | AC | 12 ms
4,372 KB |
testcase_02 | AC | 11 ms
4,372 KB |
testcase_03 | AC | 12 ms
4,372 KB |
testcase_04 | AC | 11 ms
4,368 KB |
testcase_05 | AC | 12 ms
4,372 KB |
testcase_06 | AC | 11 ms
4,368 KB |
testcase_07 | AC | 12 ms
4,368 KB |
testcase_08 | AC | 11 ms
4,372 KB |
testcase_09 | AC | 12 ms
4,368 KB |
testcase_10 | AC | 11 ms
4,372 KB |
testcase_11 | AC | 12 ms
4,372 KB |
testcase_12 | AC | 11 ms
4,368 KB |
testcase_13 | AC | 11 ms
4,368 KB |
testcase_14 | AC | 12 ms
4,372 KB |
testcase_15 | AC | 11 ms
4,368 KB |
testcase_16 | AC | 12 ms
4,368 KB |
testcase_17 | AC | 11 ms
4,372 KB |
testcase_18 | AC | 11 ms
4,372 KB |
testcase_19 | AC | 12 ms
4,368 KB |
testcase_20 | AC | 11 ms
4,368 KB |
testcase_21 | AC | 11 ms
4,368 KB |
testcase_22 | AC | 11 ms
4,372 KB |
testcase_23 | AC | 11 ms
4,372 KB |
testcase_24 | AC | 11 ms
4,368 KB |
testcase_25 | AC | 12 ms
4,372 KB |
testcase_26 | AC | 11 ms
4,372 KB |
testcase_27 | AC | 11 ms
4,368 KB |
testcase_28 | AC | 12 ms
4,372 KB |
testcase_29 | AC | 11 ms
4,368 KB |
ソースコード
#include <iostream> #include <sstream> #include <cassert> #include <cmath> #include <cstring> #include <chrono> #include <algorithm> #include <numeric> #include <vector> #include <queue> #include <string> #include <set> #include <map> #include <unordered_map> #include <random> using namespace std; #if defined(_MSC_VER) || defined(__APPLE_CC__) #define LOCAL #endif const int TIME_LIMIT = 6000 - 100; const int INF = 1000000000; typedef pair<int, int> II; std::random_device seed_gen; std::mt19937_64 engine(seed_gen()); auto start_time = chrono::high_resolution_clock::now(); inline int get_elapsed_ms() { return int(chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - start_time).count()); } struct Solver { int N; int M; vector<int> y, x, g; void input() { cin >> N >> M; y.resize(N + M); x.resize(N + M); g.resize(N + M); for (int i = 0; i < N; ++i) { cin >> y[i] >> x[i]; } } void prepare() { } void output(const vector<int>& ans) { for (int i = 0; i < M; ++i) { cout << y[i + N] << " " << x[i + N] << endl; } cout << ans.size() << endl; for (int x : ans) { if (x < N) { cout << "1 " << (x + 1) << endl; } else { cout << "2 " << (x - N + 1) << endl; } } } void classify() { for (int i = 0; i < N; ++i) { g[i] = engine() % M; } bool done = false; while (!done) { done = true; vector<int> xx(M), yy(M), cnt(M); for (int i = 0; i < N; ++i) { xx[g[i]] += x[i]; yy[g[i]] += y[i]; cnt[g[i]] += 1; } for (int i = 0; i < M; ++i) { if (cnt[i]) { xx[i] /= cnt[i]; yy[i] /= cnt[i]; x[N + i] = xx[i]; y[N + i] = yy[i]; } } for (int i = 0; i < N; ++i) { int md = INF, next_g = -1; for (int j = 0; j < M; ++j) { int dx = x[i] - xx[j], dy = y[i] - yy[j], d = dx * dx + dy * dy; if (d < md) { md = d; next_g = j; } } if (g[i] != next_g) { done = false; g[i] = next_g; } } } } vector<int> gen(const vector<int> &seq) { vector<int> r; for (int gg = 0; gg < M; ++gg) { int tg = seq[gg]; for (int i = 0; i < N; ++i) { if (g[i] == tg) { r.emplace_back(i); r.emplace_back(N + tg); } } r.emplace_back(N + seq[gg + 1]); } r.emplace_back(0); return r; } int64_t evaluate(const vector<int>& r) { int64_t s = 0; int p = 0; for (int next : r) { int dx = x[next] - x[p], dy = y[next] - y[p]; int64_t d = dx * dx + dy * dy; if (p < N) d *= 5; if (next < N) d *= 5; p = next; s += d; } return s; } void run() { int64_t min_score = 1LL << 60; vector<int> ans; classify(); vector<int> seq(M+1); iota(seq.begin(), seq.end(), 0); seq[M] = g[0]; do { if (seq[0] == g[0]) { vector<int> r = gen(seq); int64_t score = evaluate(r); if (score < min_score) { min_score = score; ans = r; } } } while (next_permutation(seq.begin(), seq.begin() + M)); output(ans); } }; int main(int argc, char* argv[]) { #if DEBUG freopen("in.txt", "r", stdin); #endif Solver solver; solver.input(); solver.prepare(); solver.run(); }