#include using namespace std; const int T_START = 360; const int T_END = 1260; const int T_STEP = 5; const int NUM_TARGETS = 21; const int NEG_INF = -999999; const int MAX_FL = 500; int N, R, M, K; double px[50], py[50]; int pw[50]; struct Flight { int a, b, s, t; }; Flight sq_arr[401]; double dist_tab[50][50]; int ftime_tab[50][50]; int vsrc[50][50], vsrc_cnt[50]; int target_t[NUM_TARGETS]; int sq_lat[50][NUM_TARGETS][50]; int plane_start[26]; int rd[26][200]; int rl[26]; mt19937 rng; long long cum_w[50], total_w; int sample_city() { long long r = rng() % total_w; int lo = 1, hi = N; while (lo < hi) { int m=(lo+hi)/2; if(cum_w[m]<=r)lo=m+1; else hi=m; } return lo; } int sample_buf(const int* buf, int n) { if (n==1) return buf[0]; long long s=0; for (int i=0;ir) return buf[i];} return buf[n-1]; } int parse_time(const char* s){int h,m;sscanf(s,"%d:%d",&h,&m);return h*60+m;} void precompute() { for (int i=1;i<=N;i++) for(int j=1;j<=N;j++){ double dx=px[i]-px[j],dy=py[i]-py[j]; dist_tab[i][j]=sqrt(dx*dx+dy*dy); } for (int i=1;i<=N;i++) for(int j=1;j<=N;j++){ if(i==j){ftime_tab[i][j]=0;continue;} double raw=60.0*dist_tab[i][j]/800.0+40.0; ftime_tab[i][j]=(int)ceil(raw/5.0)*5; } for (int j=1;j<=N;j++){ vsrc_cnt[j]=0; for (int i=1;i<=N;i++) if(i!=j && dist_tab[i][j]>=0.25*R) vsrc[j][vsrc_cnt[j]++]=i; } for (int k=0;kb.t;}); int lat[50]; for (int j=1;j<=N;j++) for(int k=0;klat[f.a]) lat[f.a]=f.s; } memcpy(sq_lat[j][k],lat,sizeof(int)*(N+1)); } } Flight pfl[26][50]; int pfl_cnt[26]; void gen_plane(int p) { pfl_cnt[p]=0; if(rl[p]<2) return; int cur=plane_start[p]; for(int i=0;i+1T_END) break; pfl[p][pfl_cnt[p]++]={a,b,cur,arr}; cur=arr; } } Flight ci_buf[MAX_FL]; int ci_cnt; void rebuild_ci() { ci_cnt=0; for(int p=1;p<=K;p++) for(int i=0;ib.t;}); } long long eval_score() { long long v=0; int lat[50]; for(int j=1;j<=N;j++){ int wj=pw[j], vc=vsrc_cnt[j]; if(!vc) continue; for(int k=0;klat[fa]) lat[fa]=ci_buf[fi].s; } } const int*sq=sq_lat[j][k], *vs=vsrc[j]; for(int vi=0;viT_END){rl[p]=i+1;return;} cur+=ft; } int cands[50],ccnt; while(true){ int last=rd[p][rl[p]-1]; ccnt=0; for(int c=1;c<=N;c++){ if(c==last) continue; if(cur+ftime_tab[last][c]<=T_END) cands[ccnt++]=c; } if(!ccnt) break; int nx=sample_buf(cands,ccnt); rd[p][rl[p]++]=nx; cur+=ftime_tab[last][nx]; } } // Get active length: positions 0..active_len-1 generate flights int active_len(int p) { return min(rl[p], pfl_cnt[p] + 1); } int main(){ rng.seed(chrono::steady_clock::now().time_since_epoch().count()); scanf("%d%d",&N,&R); for(int i=1;i<=N;i++) scanf("%lf%lf%d",&px[i],&py[i],&pw[i]); scanf("%d",&M); for(int i=0;iinit_best){ init_best=sc; for(int p=1;p<=K;p++){ memcpy(init_rd[p],rd[p],sizeof(int)*rl[p]); init_rl[p]=rl[p]; init_ps[p]=plane_start[p]; } } } for(int p=1;p<=K;p++){ memcpy(rd[p],init_rd[p],sizeof(int)*init_rl[p]); rl[p]=init_rl[p]; plane_start[p]=init_ps[p]; gen_plane(p); } rebuild_ci(); // ---- SA ---- long long cur_score=init_best, best_score=init_best; int best_rd[26][200], best_rl[26], best_ps[26]; for(int p=1;p<=K;p++){ memcpy(best_rd[p],rd[p],sizeof(int)*rl[p]); best_rl[p]=rl[p]; best_ps[p]=plane_start[p]; } auto t0=chrono::steady_clock::now(); const double time_limit=0.95; int iter=0; double cur_temp=1e13; int old_rd_buf[200]; Flight old_pfl_buf[50]; int old_rl_v, old_ps_v, old_pfl_cnt_v; Flight saved_ci[MAX_FL]; int saved_ci_cnt; while(true){ if((iter&63)==0){ double el=chrono::duration(chrono::steady_clock::now()-t0).count(); if(el>=time_limit) break; double prog=el/time_limit; cur_temp=1e13*pow(1e-4,prog); // 1e13 -> 1e9 } iter++; int p=rng()%K+1; // Save old_rl_v=rl[p]; old_ps_v=plane_start[p]; old_pfl_cnt_v=pfl_cnt[p]; memcpy(old_rd_buf,rd[p],sizeof(int)*old_rl_v); memcpy(old_pfl_buf,pfl[p],sizeof(Flight)*old_pfl_cnt_v); saved_ci_cnt=ci_cnt; memcpy(saved_ci,ci_buf,sizeof(Flight)*ci_cnt); int alen=active_len(p); // active route positions // Mutation weighted: change city 40%, insert 15%, remove 15%, swap 15%, start_time 15% int mut=rng()%20; if(mut<8 && alen>=2){ // Change city in active range int pos=rng()%alen; rd[p][pos]=sample_city(); } else if(mut<11 && rl[p]<190){ // Insert city in active range (+1 for extending) int pos=rng()%(alen+1); for(int i=rl[p];i>pos;i--) rd[p][i]=rd[p][i-1]; rd[p][pos]=sample_city(); rl[p]++; } else if(mut<14 && alen>=2){ // Remove city in active range int pos=rng()%alen; for(int i=pos;i+1=3){ // Swap two in active range int a=rng()%alen, b=rng()%alen; swap(rd[p][a],rd[p][b]); } else if(mut<19){ // Change start time int delta=((int)(rng()%25)-12)*T_STEP; // -60..+60 min plane_start[p]=max(T_START,min(T_END-60,plane_start[p]+delta)); } else { // Reinitialize rd[p][0]=sample_city(); rl[p]=1; fill_route(p); } // Validate bool ok=true; for(int i=0;iN) ok=false; for(int i=0;i+1=0); if(!accept && cur_temp>0){ accept=((rng()%1000000)<(int)(exp((double)d/cur_temp)*1000000)); } if(accept){ cur_score=ns; if(ns>best_score){ best_score=ns; for(int q=1;q<=K;q++){ memcpy(best_rd[q],rd[q],sizeof(int)*rl[q]); best_rl[q]=rl[q]; best_ps[q]=plane_start[q]; } } } else { memcpy(rd[p],old_rd_buf,sizeof(int)*old_rl_v); rl[p]=old_rl_v; plane_start[p]=old_ps_v; pfl_cnt[p]=old_pfl_cnt_v; memcpy(pfl[p],old_pfl_buf,sizeof(Flight)*old_pfl_cnt_v); ci_cnt=saved_ci_cnt; memcpy(ci_buf,saved_ci,sizeof(Flight)*saved_ci_cnt); } } for(int p=1;p<=K;p++){ memcpy(rd[p],best_rd[p],sizeof(int)*best_rl[p]); rl[p]=best_rl[p]; plane_start[p]=best_ps[p]; gen_plane(p); } fprintf(stderr,"SA: %d iters, best=%lld\n",iter,best_score); for(int p=1;p<=K;p++){ printf("%d\n",pfl_cnt[p]); for(int i=0;i