結果
問題 | No.5007 Steiner Space Travel |
ユーザー | butsurizuki |
提出日時 | 2022-07-03 04:57:12 |
言語 | C++23 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 67 ms / 1,000 ms |
コード長 | 3,045 bytes |
コンパイル時間 | 4,599 ms |
実行使用メモリ | 4,008 KB |
スコア | 4,879,783 |
最終ジャッジ日時 | 2022-07-30 13:32:22 |
合計ジャッジ時間 | 6,285 ms |
ジャッジサーバーID (参考情報) |
judge11 / judge15 |
純コード判定しない問題か言語 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 62 ms
3,764 KB |
testcase_01 | AC | 65 ms
3,840 KB |
testcase_02 | AC | 65 ms
3,880 KB |
testcase_03 | AC | 29 ms
3,852 KB |
testcase_04 | AC | 61 ms
3,896 KB |
testcase_05 | AC | 32 ms
3,808 KB |
testcase_06 | AC | 64 ms
3,820 KB |
testcase_07 | AC | 26 ms
3,800 KB |
testcase_08 | AC | 67 ms
3,760 KB |
testcase_09 | AC | 26 ms
3,828 KB |
testcase_10 | AC | 39 ms
3,852 KB |
testcase_11 | AC | 32 ms
4,008 KB |
testcase_12 | AC | 22 ms
3,864 KB |
testcase_13 | AC | 30 ms
3,896 KB |
testcase_14 | AC | 65 ms
3,904 KB |
testcase_15 | AC | 63 ms
3,848 KB |
testcase_16 | AC | 66 ms
3,852 KB |
testcase_17 | AC | 24 ms
3,828 KB |
testcase_18 | AC | 24 ms
3,768 KB |
testcase_19 | AC | 42 ms
3,760 KB |
testcase_20 | AC | 61 ms
3,828 KB |
testcase_21 | AC | 64 ms
3,796 KB |
testcase_22 | AC | 25 ms
3,824 KB |
testcase_23 | AC | 66 ms
3,764 KB |
testcase_24 | AC | 63 ms
3,760 KB |
testcase_25 | AC | 23 ms
3,760 KB |
testcase_26 | AC | 62 ms
3,836 KB |
testcase_27 | AC | 62 ms
3,876 KB |
testcase_28 | AC | 65 ms
3,844 KB |
testcase_29 | AC | 37 ms
3,836 KB |
ソースコード
#include<bits/stdc++.h> #define alpha 5 using namespace std; using pi=pair<int,int>; int n,m; int tt; int dist(pi a,pi b){ int res=(a.first-b.first)*(a.first-b.first); res+=(a.second-b.second)*(a.second-b.second); return res; } vector<pi> x; pi g[111][111]; void init_g(){ for(int i=0;i<tt;i++){ for(int j=0;j<tt;j++){ if(i==j){g[i][j]={0,i};} else{g[i][j]={1e9,-1};} } } } void gen_g(){ for(int k=0;k<tt;k++){ for(int i=0;i<tt;i++){ for(int j=0;j<tt;j++){ if(g[i][j].first>g[i][k].first+g[k][j].first){ g[i][j].first=g[i][k].first+g[k][j].first; g[i][j].second=g[i][k].second; } } } } } bool distinct(int a,int b,int c,int d){ if(a==b){return false;} if(a==c){return false;} if(a==d){return false;} if(b==c){return false;} if(b==d){return false;} if(c==d){return false;} return true; } int output_dis; vector<pi> output_coord; vector<int> output_route; int solve(mt19937_64 &eg){ vector<int> p(n); for(int i=0;i<n;i++){p[i]=i;} shuffle(p.begin()+1,p.end(),eg); p.push_back(0); for(int tr=0;tr<1000;tr++){ for(int i=0;i<n;i++){ for(int j=i+2;j<n;j++){ int ni=p[i+1]; int nj=p[j+1]; if(!distinct(i,j,ni,nj)){continue;} int bef=g[i][ni].first+g[j][nj].first; int aft=g[i][j].first+g[ni][nj].first; if(bef>aft){ int l=(i+1)%n; int r=j; while(l<r){ swap(p[l],p[r]); l++;r--; } } } } } int res=0; for(int i=0;i<n;i++){ res+=g[p[i]][p[i+1]].first; } if(output_dis>res){ output_dis=res; for(int i=n;i<n+m;i++){output_coord[i-n]=x[i];} output_route.clear(); int cp=p[0]; for(int i=0;i<n;i++){ while(cp!=p[i+1]){ output_route.push_back(cp); cp=g[cp][p[i+1]].second; } } output_route.push_back(p[n]); } return res; } int main(){ random_device seed_gen; mt19937_64 engine(seed_gen()); ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; output_dis=2e9; output_coord.resize(m); tt=n+m; x.resize(n+m); for(int i=0;i<n;i++){ cin >> x[i].first >> x[i].second; } double deg=(2.0*3.1415926535897932384)/((double)m); for(int i=n;i<n+m;i++){ x[i].first=(int)(500.5+300.0*cos(deg*((double)i-n))); x[i].second=(int)(500.5+300.0*sin(deg*((double)i-n))); cerr << x[i].first << ' ' << x[i].second << '\n'; } for(int tr=0;tr<1;tr++){ for(int i=0;i<tt;i++){ for(int j=0;j<tt;j++){ int ce=1; if(i<n){ce*=alpha;} if(j<n){ce*=alpha;} g[i][j]={ce*dist(x[i],x[j]),j}; } } gen_g(); solve(engine); } cerr << output_dis << "\n"; for(auto &nx : output_coord){ cout << nx.first << ' ' << nx.second << '\n'; } cout << output_route.size() << '\n'; for(auto &nx : output_route){ if(nx<n){ cout << "1 " << nx+1 << "\n"; } else{ cout << "2 " << nx-n+1 << "\n"; } } return 0; }