結果
問題 | No.5007 Steiner Space Travel |
ユーザー | olphe |
提出日時 | 2022-07-30 17:50:29 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 931 ms / 1,000 ms |
コード長 | 4,342 bytes |
コンパイル時間 | 1,533 ms |
実行使用メモリ | 5,160 KB |
スコア | 8,690,364 |
最終ジャッジ日時 | 2022-07-30 17:51:13 |
合計ジャッジ時間 | 31,456 ms |
ジャッジサーバーID (参考情報) |
judge13 / judge12 |
純コード判定しない問題か言語 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 900 ms
5,152 KB |
testcase_01 | AC | 913 ms
4,900 KB |
testcase_02 | AC | 871 ms
4,900 KB |
testcase_03 | AC | 909 ms
5,156 KB |
testcase_04 | AC | 891 ms
4,900 KB |
testcase_05 | AC | 929 ms
4,904 KB |
testcase_06 | AC | 899 ms
4,904 KB |
testcase_07 | AC | 931 ms
4,900 KB |
testcase_08 | AC | 926 ms
4,904 KB |
testcase_09 | AC | 913 ms
4,900 KB |
testcase_10 | AC | 896 ms
5,156 KB |
testcase_11 | AC | 915 ms
4,900 KB |
testcase_12 | AC | 875 ms
4,900 KB |
testcase_13 | AC | 889 ms
4,900 KB |
testcase_14 | AC | 910 ms
4,904 KB |
testcase_15 | AC | 899 ms
5,160 KB |
testcase_16 | AC | 921 ms
4,904 KB |
testcase_17 | AC | 872 ms
4,900 KB |
testcase_18 | AC | 921 ms
5,160 KB |
testcase_19 | AC | 914 ms
5,156 KB |
testcase_20 | AC | 887 ms
4,904 KB |
testcase_21 | AC | 892 ms
4,900 KB |
testcase_22 | AC | 914 ms
5,156 KB |
testcase_23 | AC | 905 ms
4,900 KB |
testcase_24 | AC | 906 ms
4,904 KB |
testcase_25 | AC | 893 ms
4,900 KB |
testcase_26 | AC | 902 ms
5,160 KB |
testcase_27 | AC | 866 ms
4,900 KB |
testcase_28 | AC | 878 ms
4,900 KB |
testcase_29 | AC | 906 ms
4,900 KB |
ソースコード
#include "iostream" #include "climits" #include "list" #include "queue" #include "stack" #include "set" #include "functional" #include "algorithm" #include "string" #include "map" #include "unordered_map" #include "unordered_set" #include "iomanip" #include "cmath" #include "random" #include "bitset" #include "cstdio" #include "numeric" #include "cassert" #include "ctime" using namespace std; constexpr int by = 5; int N, M; vector<int>x; vector<int>y; vector<int>ans; class XorShift { unsigned int x, y, z, w, t; public: XorShift() { x = 133553533; y = 314867339; z = 664298413; w = 999999937; t = 0; } unsigned int rand() { t = x ^ (x << 11); x = y; y = z; z = w; w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); return w & 0x7fffffff; } }; XorShift xs; void Initialize() { cin >> N >> M; x.resize(N); y.resize(N); for (int i = 0; i < N; i++) { cin >> x[i] >> y[i]; } } int Score(vector<vector<int>>dis, vector<char>route) { int sum = 0; for (int i = 1; i < route.size(); i++) { sum += dis[route[i - 1]][route[i]]; } return round(1e9 / (1000 + sqrt(sum))); } int Dist(int x1, int x2, int y1, int y2) { return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); } void Station() { vector<int>cl(N); vector<int>use(N, 1); for (int i = 0; i < N; i++) { cl[i] = xs.rand() % M; } int border = xs.rand() % 51; for (int i = 0; i < N; i++) { for (int j = 0; j < i; j++) { if (hypot(x[i] - x[j], y[i] - y[j]) < border)use[i] = 0; } } vector<double>cx(M); vector<double>cy(M); for (int i = 0; i < 20; i++) { for (auto& i : cx)i = 0; for (auto& i : cy)i = 0; vector<int>cxnum(M); vector<int>cynum(M); for (int i = 0; i < N; i++) { if (use[i]) { cx[cl[i]] += x[i]; cy[cl[i]] += y[i]; cxnum[cl[i]]++; cynum[cl[i]]++; } } for (int i = 0; i < M; i++) { if (cxnum[i]) { cx[i] /= cxnum[i]; cy[i] /= cynum[i]; } } for (int j = 0; j < N; j++) { for (int k = 0; k < M; k++) { if (Dist(x[j], cx[cl[j]], y[j], cy[cl[j]]) > Dist(x[j], cx[k], y[j], cy[k])) { cl[j] = k; } } } } for (int i = 0; i < M; i++) { x.push_back(round(cx[i])); y.push_back(round(cy[i])); } } int bestscore = 0; vector<int>outx; vector<int>outy; void TSP() { vector<vector<int>>dis(N, vector<int>(N)); vector<vector<vector<int>>>use(N, vector<vector<int>>(N)); for (int i = 0; i < N; i++) { for (int j = i + 1; j < N; j++) { dis[j][i] = dis[i][j] = Dist(x[i], x[j], y[i], y[j]) * by * by; for (int k = 0; k < M; k++) { for (int l = 0; l < M; l++) { int c = Dist(x[i], x[N + k], y[i], y[N + k]) * by + Dist(x[N + k], x[N + l], y[N + k], y[N + l]) + Dist(x[N + l], x[j], y[N + l], y[j]) * by; if (c < dis[i][j]) { dis[i][j] = c; use[i][j] = { N + k,N + l }; use[j][i] = { N + l,N + k }; dis[j][i] = c; } } } } } vector<char>route(N + 1); for (int i = 0; i < N + 1; i++) { route[i] = i % N; } for (int loop = 0; loop < 30000; loop++) { int a = xs.rand() % (N - 1); int b = xs.rand() % (N - 2) + a + 1; b %= N - 1; if (a > b)swap(a, b); a++; b += 2; double bef = dis[route[a - 1]][route[a]] + dis[route[b - 1]][route[b]]; double aft = dis[route[a - 1]][route[b - 1]] + dis[route[a]][route[b]]; if (bef >= aft) { reverse(route.begin() + a, route.begin() + b); } else { } } int score = Score(dis, route); cerr << score << endl; if (bestscore < score) { bestscore = score; ans.clear(); outx.clear(); outy.clear(); for (int i = N; i < x.size(); i++) { outx.push_back(x[i]); outy.push_back(y[i]); } ans.push_back(route[0]); for (int i = 0; i < N; i++) { if (use[route[i]][route[i + 1]].size()) { ans.push_back(use[route[i]][route[i + 1]][0]); ans.push_back(use[route[i]][route[i + 1]][1]); } ans.push_back(route[i + 1]); } } } void Output() { cerr << "----------------" << endl; for (int i = 0; i < outx.size(); i++) { cout << outx[i] << " " << outy[i] << endl; } cout << ans.size() << endl; for (auto i : ans) { if (i < N) { cout << 1 << " " << i + 1 << endl; } else { cout << 2 << " " << i - N + 1 << endl; } } } int main() { ios::sync_with_stdio(false); cin.tie(0); Initialize(); for (int i = 0; i < 310; i++) { Station(); TSP(); x.resize(N); y.resize(N); } Output(); }