結果

問題 No.5007 Steiner Space Travel
ユーザー hiikunZ
提出日時 2022-07-30 16:15:02
言語 C++17(gcc12)
(gcc 12.3.0 + boost 1.87.0)
結果
AC  
実行時間 953 ms / 1,000 ms
コード長 5,255 bytes
コンパイル時間 2,007 ms
実行使用メモリ 6,952 KB
スコア 1,374,654
最終ジャッジ日時 2022-07-30 16:15:36
合計ジャッジ時間 33,311 ms
ジャッジサーバーID
(参考情報)
judge13 / judge10
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include<bits/stdc++.h>
using namespace std;
using namespace std::chrono;
using std::chrono::system_clock;
using std::chrono::seconds;
//#include<atcoder/all>
//using namespace atcoder;
using ll = long long int;
using ull = unsigned long long int;
using ld = long double;
constexpr ll MAX = 2000000000000000000;
constexpr ld PI = 3.14159265358979;
constexpr ll MOD = 0;//2024948111;
ld dotorad(ld K){return PI * K / 180.0;}
ld radtodo(ld K){return K * 180.0 / PI;}
mt19937 mt;
void randinit(){srand((unsigned)time(NULL));mt = mt19937(rand());}
const ll N = 100,M = 8;
ll A[N],B[N],C[M],D[M];
ll X[N + 1];
ll Dis[N][N],DA[N][N],DB[N][N];
ll gomi;
ll now_score;
ld used_time;
const ld starttemp = 100;
const ld endtemp = 1;
ld temp;
const ld time_limit = 0.95;
const ll BIG = (1LL << 30);
void calc_dis(){
for(ll i = 0;i < N;i++){
for(ll j = 0;j < N;j++){
if(i == j) Dis[i][j] = 0;
else if(i > j) Dis[i][j] = Dis[j][i];
else{
ll ans = 25 * ((A[i] - A[j]) * (A[i] - A[j]) - (B[i] - B[j]) * (B[i] - B[j]));
for(ll p = 0;p < M;p++){
for(ll q = 0;q < M;q++){
ll d1 = 5 * ((A[i] - C[p]) * (A[i] - C[p]) + (B[i] - D[p]) * (B[i] - D[p]));
ll d2 = 1 * ((C[q] - C[p]) * (C[q] - C[p]) + (D[q] - D[p]) * (D[q] - D[p]));
ll d3 = 5 * ((C[q] - A[j]) * (C[q] - A[j]) + (D[q] - B[j]) * (D[q] - B[j]));
ll d = d1 + d2 + d3;
ans = min(ans,d);
}
}
Dis[i][j] = ans;
}
}
}
}
void calc_dis_last(){
for(ll i = 0;i < N;i++){
for(ll j = 0;j < N;j++){
if(i == j) Dis[i][j] = 0;
else if(i > j){
Dis[i][j] = Dis[j][i];
DA[i][j] = DB[j][i];
DB[i][j] = DA[j][i];
}
else{
ll ans = 25 * ((A[i] - A[j]) * (A[i] - A[j]) - (B[i] - B[j]) * (B[i] - B[j]));
ll a = -1,b = -1;
for(ll p = 0;p < M;p++){
for(ll q = 0;q < M;q++){
ll d1 = 5 * ((A[i] - C[p]) * (A[i] - C[p]) + (B[i] - D[p]) * (B[i] - D[p]));
ll d2 = 1 * ((C[q] - C[p]) * (C[q] - C[p]) + (D[q] - D[p]) * (D[q] - D[p]));
ll d3 = 5 * ((C[q] - A[j]) * (C[q] - A[j]) + (D[q] - B[j]) * (D[q] - B[j]));
ll d = d1 + d2 + d3;
if(ans > d){
ans = d;
a = p;
b = q;
}
}
}
Dis[i][j] = ans;
DA[i][j] = a;
DB[i][j] = b;
}
}
}
}
system_clock::time_point start;
vector<ll> ans1,ans2;
int main(){
start = system_clock::now();
cin >> gomi >> gomi;
for(ll i = 0;i < N;i++) cin >> A[i] >> B[i];
for(ll i = 0;i < N;i++) X[i] = i;
X[N] = 0;
C[0] = 160;D[0] = 160;
C[1] = 160;D[1] = 500;
C[2] = 160;D[2] = 890;
C[3] = 500;D[3] = 330;
C[4] = 500;D[4] = 670;
C[5] = 890;D[5] = 160;
C[6] = 890;D[6] = 500;
C[7] = 890;D[7] = 890;
calc_dis();
now_score = 0;
for(ll i = 0;i < N;i++){
now_score += Dis[X[i]][X[i + 1]];
}
used_time = 0;
temp = starttemp + (endtemp - starttemp) * used_time / time_limit;
while(1){
for(ll i = 0;i < 100;i++){
ll x = mt() % (N - 1) + 1;
ll y = mt() % (N - 1) + 1;
if(x == y) continue;
if(x > y) swap(x,y);
ll new_score = now_score;
new_score -= Dis[X[x - 1]][X[x]];
new_score -= Dis[X[y]][X[y + 1]];
new_score += Dis[X[x - 1]][X[y]];
new_score += Dis[X[x]][X[y + 1]];
double probability = exp((now_score - new_score) / temp);
bool FORCE_NEXT = probability > (ld)(mt() % BIG) / BIG;
if(FORCE_NEXT){
now_score = new_score;
swap(X[x],X[y]);
}
}
used_time = duration_cast<microseconds>(system_clock::now() - start).count() * 1e-6;
if(used_time > time_limit) break;
temp = starttemp + (endtemp - starttemp) * used_time / time_limit;
if(mt() % 2 == 0){
//C,D
}
}
calc_dis_last();
for(ll i = 0;i < M;i++) cout << C[i] << " " << D[i] << endl;
for(ll i = 0;i <= N;i++){
ans1.emplace_back(1);
ans2.emplace_back(X[i] + 1);
if(i < N){
ll a = DA[X[i]][X[i + 1]],b = DB[X[i]][X[i + 1]];
if(a != -1){
if(a == b){
ans1.emplace_back(2);
ans2.emplace_back(a + 1);
}
else{
ans1.emplace_back(2);
ans2.emplace_back(a + 1);
ans1.emplace_back(2);
ans2.emplace_back(b + 1);
}
}
}
}
cout << (ll)ans1.size() << endl;
for(ll i = 0;i < (ll)ans1.size();i++) cout << ans1[i] << " " << ans2[i] << endl;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0