/**************************************************/ /* C++ template by michirakara 「嘘解法は友達」(?) */ //include std #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace chrono; //コンパイラと浮動小数点高速化 #pragma GCC optimize("O3") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #pragma GCC optimize("unroll-loops") //cin,endlの高速化 //インタラクティブのときは外す struct Fast {Fast() {std::cin.tie(0); ios::sync_with_stdio(false);}} fast; #define endl '\n' //using using ll=long long; using ld=long double; using vi=vector; using vl=vector; using vvi=vector; using vvl=vector; using pii=pair; using pll=pair;//PLLはY-permが好き const ll LINF=0x1fffffffffffffff; const int INF=0x3fffffff; const int MOD=998244353; const ld PI=3.1415926535897932384626433832795028841971; const ll dx[]={0,1,0,-1}; const ll dy[]={1,0,-1,0}; const ll dx8[]={0,1,0,-1,1,-1,1,-1}; const ll dy8[]={1,0,-1,0,1,1,-1,-1}; //define #define itn int//これすき #define elif else if /*最終兵器 絶対使うな #define int long long */ //マクロ //min(a,b,....)-> min({a,b,....}) //Pythonのように任意個の要素を入れることの可能なmin() template constexpr auto min(T... a){ return min(initializer_list>{a...}); } //同じくmax template constexpr auto max(T... a){ return max(initializer_list>{a...}); } void scan(int& a){cin>>a;} void scan(unsigned& a){cin>>a;} void scan(long& a){cin>>a;} void scan(long long& a){cin>>a;} void scan(unsigned long long& a){cin>>a;} void scan(float& a){cin>>a;} void scan(double& a){cin>>a;} void scan(long double& a){cin>>a;} void scan(char& a){cin>>a;} void scan(string& a){cin>>a;} template void scan(vector&); template void scan(array&); template void scan(pair&); template void scan(T(&)[size]); template void scan(vector& a){for(auto&& i:a)scan(i);}; template void scan(deque& a){for(auto&& i:a)scan(i);}; template void scan(array& a){for(auto&& i:a)scan(i);}; template void scan(pair& a){scan(a.first);scan(a.second);}; template void scan(T(&a)[size]){for(auto&& i:a)scan(i);}; template void scan(T& a){cin>>a;} void input(){} //input(a,b...)-> cin>>a>>b>>... //input(変数名...)で勝手に入力を受け取ってくれる かしこい template void input(Head& H,Tail&... T){ scan(H);input(T...); } //INT(a,b)-> int a,b;cin>>a>>b; //INT(変数名)でintの変数を作ってinputから取ってくれる かしこい #define INT(...)int __VA_ARGS__; input(__VA_ARGS__) //LL(a,b)-> long long a,b;cin>>a>>b; //LL(変数名)でllの変数を作ってinputから取ってくれる かしこい #define LL(...)ll __VA_ARGS__; input(__VA_ARGS__) void puts(){cout<<' ';} void puts(int a){cout< void puts(vector); template void puts(array); template void puts(pair); template void puts(T[size]); template void puts(vector a){if(a.empty())return;puts(a[0]);for(auto i=a.begin();++i!=a.end();){cout<<' ';puts(*i);}}; template void puts(deque a){if(a.empty())return;puts(a[0]);for(auto i=a.begin();++i!=a.end();){cout<<' ';puts(*i);}}; template void puts(array a){puts(a[0]);for(auto i=a.begin();++i!=a.end();){cout<<' ';puts(*i);}}; template void puts(pair a){puts(a.first);cout<<' ';puts(a.second);}; template void puts(T(a)[size]){puts(a[0]);for(auto i=a;++i!=end(a);){cout<<' ';puts(*i);}}; template void puts(T a){cout< void print(Head H,Tail... T){ puts(H);print(T...); } //rep1(i,a)-> i in [0,a) //reps(i,a,b)-> i in [a,b) //r_p(i,a,b,c)-> i in [a,b) by c #define rep1(i, a) for(ll i=0; i<(ll)a; i++) #define reps(i, a, b) for(ll i=a; i<(ll)b; i++) #define r_p(i, a, b, c) for(ll i=a; i<(ll)b; i+=c) //rep(i,a)-> i in [0,a) //rep(i,a,b)-> i in [a,b) //rep(i,a,b,c)-> i in [a,b) by c //大体Pythonのfor文と同じrepマクロ #define overload4(a, b, c, d, e, ...) e #define rep(...) overload4(__VA_ARGS__, r_p, reps, rep1)(__VA_ARGS__) //イテレータの最初から最後までを返す 例:sort(all(v)) #define all(x) (x).begin(),(x).end() //上の逆順 例:sort(rall(v)) (降順にソートされる) #define rall(x) (x).rbegin(),(x).rend() //next_permutationでもらえる順に全部順列を返す 例:for(vi i:perm(v)) #define perm(c) sort(all(c));for(bool c##p=1;c##p;c##p=next_permutation(all(c))) //sizeを int(ここ大事) で返す #define sz(x) ((int)(x).size()) //boolを渡すとYesNoを出力する #define YesNo(bool) if(bool){cout<<"Yes"<> 19)) ^ (t ^ (t >> 8)); } //[a,b) int RandInt(int a,int b){ return randXor()%(b-a)+a; } double Randouble(){ return (randXor() + 0.5) * (1.0 / 0xffffffff); } ll GetDist(int fi,int si){ if(fi>=0){ if(si>=0){ return (pow((X[fi]-X[si]),2)+pow((Y[fi]-Y[si]),2))*A*A; }else{ return (pow((X[fi]-X2[~si]),2)+pow((Y[fi]-Y2[~si]),2))*A; } }else{ if(si>=0){ return (pow((X2[~fi]-X[si]),2)+pow((Y2[~fi]-Y[si]),2))*A; }else{ return (pow((X2[~fi]-X2[~si]),2)+pow((Y2[~fi]-Y2[~si]),2)); } } } ll GetScore(vi &P){ ll res=0; rep(i,sz(P)){ res+=GetDist(P[i],P[(i+sz(P)-1)%sz(P)]); } return res; } int main(){ input(N,M); rep(i,N)cin>>X[i]>>Y[i]; vi tmpy={250,250,250,500,500,750,750,750}; vi tmpx={250,500,750,333,666,250,500,750}; rep(i,8){ X2[i]=tmpx[i]; Y2[i]=tmpy[i]; } //初期解の作成 vector gone(N,false); gone[0]=true; vi P={0}; int nx=X[0],ny=Y[0]; rep(i,1,N){ int mi=INF; int to=-1; rep(j,N){ if(gone[j])continue; int tmp=(nx-X[j])*(nx-X[j])+(ny-Y[j])*(ny-Y[j]); if(tmpr)swap(l,r); double temp=start_temp+(end_temp-start_temp)*time/end_time; double prob=exp((GetDist(P[l-1],P[l])+GetDist(P[r],P[(r+1)%sz(P)]))-(GetDist(P[l-1],P[r])+GetDist(P[l],P[(r+1)%sz(P)])))/temp; if(Randouble()GetDist(P[ind],-i-1)){ near=GetDist(P[ind],-i-1); mi=i; } } P.insert(P.begin()+ind,-mi-1); ll score_new=GetScore(P); prob=exp(score_now-score_new)/temp; if(Randouble()(system_clock::now()-start_clock).count()*1e-6); }while(time=0){ print(1,' ',P[i]+1); }else{ print(2,' ',-P[i]); } } print(1,' ',1); cerr<