結果

問題 No.5007 Steiner Space Travel
ユーザー kenskens
提出日時 2022-07-30 15:34:11
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 108 ms / 1,000 ms
コード長 2,275 bytes
コンパイル時間 3,963 ms
実行使用メモリ 4,104 KB
スコア 6,098,586
最終ジャッジ日時 2022-07-30 15:34:20
合計ジャッジ時間 8,069 ms
ジャッジサーバーID
(参考情報)
judge10 / judge12
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 101 ms
3,700 KB
testcase_01 AC 98 ms
3,864 KB
testcase_02 AC 93 ms
3,620 KB
testcase_03 AC 106 ms
3,816 KB
testcase_04 AC 106 ms
4,104 KB
testcase_05 AC 97 ms
3,676 KB
testcase_06 AC 95 ms
3,748 KB
testcase_07 AC 96 ms
3,748 KB
testcase_08 AC 98 ms
3,704 KB
testcase_09 AC 99 ms
3,800 KB
testcase_10 AC 95 ms
3,700 KB
testcase_11 AC 94 ms
3,944 KB
testcase_12 AC 98 ms
3,596 KB
testcase_13 AC 95 ms
3,920 KB
testcase_14 AC 95 ms
3,916 KB
testcase_15 AC 100 ms
3,848 KB
testcase_16 AC 107 ms
3,664 KB
testcase_17 AC 96 ms
3,732 KB
testcase_18 AC 96 ms
3,920 KB
testcase_19 AC 97 ms
3,928 KB
testcase_20 AC 97 ms
3,588 KB
testcase_21 AC 97 ms
3,976 KB
testcase_22 AC 108 ms
3,912 KB
testcase_23 AC 104 ms
3,956 KB
testcase_24 AC 96 ms
3,676 KB
testcase_25 AC 97 ms
3,896 KB
testcase_26 AC 94 ms
3,840 KB
testcase_27 AC 104 ms
3,828 KB
testcase_28 AC 108 ms
3,904 KB
testcase_29 AC 95 ms
3,660 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#include <atcoder/all>
using namespace atcoder;
using namespace std;
#define rep(i,n) for(int i = 0; i < (int)n; i++)
using ll = long long;
using P = pair<ll,ll>;
constexpr int N = 100;
constexpr int M = 8;
constexpr ll A = 5;
constexpr int time_limit = 900;

// simulated annealing
constexpr double temp_start = 1.0;
constexpr double temp_end = 0.00001; 
constexpr int climb_loop = 1000000;

ll a[N], b[N];

// random
int seed = 12345;
mt19937 eng(seed);
uniform_real_distribution<> uniform_01;

// timer
class Timer {
private:
  chrono::system_clock::time_point start;
public:
  Timer() {
    start = chrono::system_clock::now();
  }

  int get_ms() {
    auto end = chrono::system_clock::now();
    auto t = chrono::duration_cast<chrono::milliseconds>(end-start).count();
    return t;
  }
};

inline ll dist2(int u, int v, ll alpha) {
  ll dx = a[u]-a[v], dy = b[u]-b[v];
  return alpha*(dx*dx + dy*dy);
}

void solve() {
  Timer timer;

  // input
  int hello;
  cin >> hello >> hello;
  rep(i,N) cin >> a[i] >> b[i];

  vector<int> seq(N+1);
  rep(i,N) seq[i] = i;
  seq[N] = 0;

  ll score = 0;
  for(int u = 1; u <= N; u++) score += dist2(seq[u],seq[u-1],A*A);

  // best sequence
  ll best_score = score;
  vector<int> best_seq = seq;

  // two opt
  rep(cn,climb_loop) {
    if(timer.get_ms() > time_limit) break;
    double temp = temp_start + (temp_end - temp_start)*cn/climb_loop;
    int s = eng() % (N-1) + 1;
    int t = eng() % (N-1) + 1;

    if(s == t) continue;
    if(s > t) swap(s,t);

    ll score_diff = dist2(seq[t],seq[s-1],A*A) + dist2(seq[s],seq[t+1],A*A) - dist2(seq[s],seq[s-1],A*A) - dist2(seq[t],seq[t+1],A*A);
    if(score_diff < 0 || uniform_01(eng) < exp((double)-score_diff/temp)) {
      score += score_diff;
      reverse(seq.begin()+s,seq.begin()+t+1);

      if(score < best_score) {
        best_score = score;
        best_seq = seq;
      }
    }
  }

  int final_score = round(1e9/(1000.0+sqrt((double)best_score)));  

  // cerr << best_score << endl;
  
  cerr << "Time " << timer.get_ms() << endl;
  cerr << "Score " << final_score << endl;

  rep(i,M) cout << 0 << " " << 0 << endl;
  cout << N+1 << endl;
  rep(i,N+1) cout << 1 << " " << best_seq[i]+1 << endl;
}

int main() {
  solve();
  return 0;
}
0