結果

問題 No.5007 Steiner Space Travel
ユーザー hotpepsihotpepsi
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

#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();
}
0