結果
問題 | No.5007 Steiner Space Travel |
ユーザー | Haa |
提出日時 | 2022-07-30 15:25:06 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 965 ms / 1,000 ms |
コード長 | 4,087 bytes |
コンパイル時間 | 2,184 ms |
実行使用メモリ | 6,952 KB |
スコア | 7,881,253 |
最終ジャッジ日時 | 2022-07-30 15:25:40 |
合計ジャッジ時間 | 32,900 ms |
ジャッジサーバーID (参考情報) |
judge11 / judge12 |
純コード判定しない問題か言語 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 932 ms
5,152 KB |
testcase_01 | AC | 912 ms
4,904 KB |
testcase_02 | AC | 907 ms
4,904 KB |
testcase_03 | AC | 905 ms
4,900 KB |
testcase_04 | AC | 916 ms
5,160 KB |
testcase_05 | AC | 931 ms
5,160 KB |
testcase_06 | AC | 907 ms
4,900 KB |
testcase_07 | AC | 910 ms
5,160 KB |
testcase_08 | AC | 965 ms
4,908 KB |
testcase_09 | AC | 910 ms
4,904 KB |
testcase_10 | AC | 933 ms
4,904 KB |
testcase_11 | AC | 907 ms
4,904 KB |
testcase_12 | AC | 908 ms
4,904 KB |
testcase_13 | AC | 907 ms
5,160 KB |
testcase_14 | AC | 916 ms
4,900 KB |
testcase_15 | AC | 923 ms
5,160 KB |
testcase_16 | AC | 911 ms
4,904 KB |
testcase_17 | AC | 932 ms
5,156 KB |
testcase_18 | AC | 934 ms
6,952 KB |
testcase_19 | AC | 910 ms
4,908 KB |
testcase_20 | AC | 934 ms
5,160 KB |
testcase_21 | AC | 918 ms
4,904 KB |
testcase_22 | AC | 911 ms
4,904 KB |
testcase_23 | AC | 917 ms
4,904 KB |
testcase_24 | AC | 908 ms
4,900 KB |
testcase_25 | AC | 934 ms
4,900 KB |
testcase_26 | AC | 906 ms
4,904 KB |
testcase_27 | AC | 914 ms
4,900 KB |
testcase_28 | AC | 911 ms
4,900 KB |
testcase_29 | AC | 913 ms
4,904 KB |
コンパイルメッセージ
main.cpp: 関数 ‘void solve()’ 内: main.cpp:141:18: 警告: structured bindings only available with ‘-std=c++17’ or ‘-std=gnu++17’ 141 | for(auto [t,r]:ans[i]){ | ^ main.cpp:119:17: 警告: ‘ry’ はこの関数内初期化されずに使用されるかもしれません [-Wmaybe-uninitialized] 119 | if(ry==0){ | ^~
ソースコード
#include <bits/stdc++.h> using namespace std; typedef long long int ll; #define REP(i,n) for(ll i=0;i<(n);i++) #define ALL(v) v.begin(),v.end() template<typename T> bool chmax(T &x, const T &y) {return (x<y)?(x=y,true):false;}; template<typename T> bool chmin(T &x, const T &y) {return (x>y)?(x=y,true):false;}; constexpr ll MOD=998244353; constexpr ll INF=2e18; struct Point{ int x, y; }; inline int pdist(const Point& p1, const Point& p2){ return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y); } const double TL=0.9; const double T0=8000; const double T1=10; double start, T; int alp=5; int N, M; vector<Point> P(100); Point cog(const set<int>& s){ int sz=s.size(); int xsum=0, ysum=0; for(auto i:s){ xsum+=P[i].x; ysum+=P[i].y; } return {xsum/sz,ysum/sz}; } void input(){ cin >> N >> M; REP(i,N) cin >> P[i].x >> P[i].y; } void solve(){ vector<vector<int>> dist(N,vector<int>(N)); REP(i,N)REP(j,N) dist[i][j]=pdist(P[i],P[j]); vector<int> ord(N); iota(ALL(ord),0); vector<set<int>> sss(M); REP(i,M) sss[i]={ord[i],ord[(i+1)%N]}; vector<Point> ssp(M); REP(i,M) ssp[i]=cog(sss[i]); ll cost=0, maxcost=INF; REP(i,N) cost+=alp*alp*dist[ord[i]][ord[(i+1)%N]]; vector<Point> ansssp; vector<vector<pair<int,int>>> ans; int rcnt=0; for(rcnt=0;true;rcnt++){ int rx, ry, r1, r2; rx=rand()%2; if(rx!=0){ r1=rand()%N+1; r2=rand()%N+1; if(r1>r2) swap(r1,r2); reverse(ord.begin()+r1,ord.begin()+r2); } else{ ry=rand()%2; if(ry==0){ r1=rand()%M; r2=rand()%N; if(sss[r1].find(r2)!=sss[r1].end()) continue; sss[r1].insert(r2); ssp[r1]=cog(sss[r1]); } else{ r1=rand()%M; r2=rand()%N; if(sss[r1].size()==2) continue; if(sss[r1].find(r2)==sss[r1].end()) continue; sss[r1].erase(r2); ssp[r1]=cog(sss[r1]); } } vector<vector<pair<int,int>>> pans(N); ll newcost=0; REP(i,N){ ll mcost=alp*alp*pdist(P[ord[i]],P[ord[(i+1)%N]]); pans[i]={{0,ord[i]}}; REP(j,M)REP(k,M+1){ if(k==M){ if(chmin(mcost,(ll)alp*(pdist(P[ord[i]],ssp[j])+pdist(ssp[j],P[ord[(i+1)%N]])))){ pans[i]={{0,ord[i]},{1,j}}; } } else{ if(chmin(mcost,(ll)alp*(pdist(P[ord[i]],ssp[j])+pdist(ssp[k],P[ord[(i+1)%N]]))+pdist(ssp[j],ssp[k]))){ pans[i]={{0,ord[i]},{1,j},{1,k}}; } } } newcost+=mcost; if(i==N-1) pans[i].push_back({0,0}); } if(chmin(maxcost,newcost)){ ans=pans; ansssp=ssp; } if(rand()%1000000>exp((newcost-cost)/T)*1e6) cost=newcost; else{ if(rx!=0){ reverse(ord.begin()+r1,ord.begin()+r2); } else{ if(ry==0){ sss[r1].erase(r2); ssp[r1]=cog(sss[r1]); } else{ sss[r1].insert(r2); ssp[r1]=cog(sss[r1]); } } } if(rcnt%50==0){ double t=(double)(clock()-start)/CLOCKS_PER_SEC/TL; if(t>=1.0) break; T=pow(T0,(t-0.6)/0.4)*pow(T1,t-0.6); } } REP(i,M) cout << ansssp[i].x << " " << ansssp[i].y << endl; int szs=0; REP(i,N) szs+=ans[i].size(); cout << szs << endl; REP(i,N){ for(auto [t,r]:ans[i]){ cout << t+1 << " " << r+1 << endl; } } } int main(){ start=clock(); input(); solve(); return 0; }