#include using namespace std; using pii=pair; using tii=tuple; using qii=tuple; using ll=long long; using ld=long double; const int INF=1e9; #define rep(i,n) for (int i=0;i<(int)(n);i++) #define all(v) v.begin(),v.end() template void chmin(T &a,T b){ if(a>b){ a=b; } } template void chmax(T &a,T b){ if(a> tree; //0->back,1->front->2->center struct Solver{ double score(vector> &ans){ ll sum_h2=0; int sum_h=0; rep(i,K){ int now=0; rep(j,4){ now+=tree[min(2,j)][ans[i][j]].h; } sum_h2+=(ll)now*(ll)now; sum_h+=now; } return ((double)sum_h2/(double)K)-((double)sum_h/(double)K)*((double)sum_h/(double)K); } int true_score(vector> &ans){ int mx=-INF,mn=INF; rep(i,K){ int now=0; rep(j,4){ now+=tree[min(2,j)][ans[i][j]].h; } chmax(mx,now); chmin(mn,now); } return mx-mn; } void solve(){ int all_min_score=INF; vector> all_min_score_ans; rep(t,4){ set st_back,st_center; rep(i,N) st_back.insert({tree[0][i].w,i}); rep(i,2*N) st_center.insert({tree[2][i].w,i}); vector> ans(K,vector(4,-10)); //back->front->center1->center2 int cnt_tree=0; vector front_ord(N),center_ord(2*N); rep(i,N) front_ord[i]=i; rep(i,2*N) center_ord[i]=i; if(t&1) sort(all(front_ord),[&](int i,int j){return tree[1][i].wtree[1][j].w;}); if(t&2) sort(all(center_ord),[&](int i,int j){return tree[2][i].wtree[2][j].w;}); for(auto &i:front_ord){ for(auto &j:center_ord){ if(tree[2][j].w<=tree[1][i].w) continue; if(st_center.find({tree[2][j].w,j})==st_center.end()) continue; auto itr_back=st_back.lower_bound({tree[1][i].w,-INF}); if(itr_back==st_back.begin()) continue; itr_back--; auto itr_center=st_center.upper_bound({tree[2][j].w,INF}); if(itr_center==st_center.end()) continue; ans[cnt_tree]={(*itr_back).second,i,j,(*itr_center).second}; st_back.erase(itr_back); st_center.erase(itr_center); st_center.erase({tree[2][j].w,j}); cnt_tree++; break; } if(cnt_tree==K) break; } if(cnt_tree!=K) continue; vector> used(3,vector(2*N,0)); rep(i,K){ rep(j,4){ used[min(2,j)][ans[i][j]]=1; } } vector> not_used(3); rep(i,3){ rep(j,2*N){ if(i!=2&&j==N) break; if(!used[i][j]) not_used[i].push_back(j); } } mt19937 mt; set st; vector sum_h(K,0); rep(i,K){ rep(j,4){ sum_h[i]+=tree[min(2,j)][ans[i][j]].h; } st.insert({sum_h[i],i}); } int min_score=(*st.rbegin()).first-(*st.begin()).first; auto start=chrono::system_clock::now(); while(true){ auto now=chrono::system_clock::now(); int ms=chrono::duration_cast(now-start).count(); if(300<=ms) break; int x=(*st.rbegin()).second,y=mt()%4; if(mt()%2==0) x=(*st.begin()).second; if(mt()%3==0){ int p=mt()%K,q=y; if(x==p) continue; if(2<=y) q=2+mt()%2; st.erase({sum_h[x],x}); st.erase({sum_h[p],p}); int before_sum_h_x=sum_h[x],before_sum_h_p=sum_h[p]; sum_h[x]-=tree[min(2,y)][ans[x][y]].h; sum_h[p]-=tree[min(2,y)][ans[p][q]].h; sum_h[x]+=tree[min(2,y)][ans[p][q]].h; sum_h[p]+=tree[min(2,y)][ans[x][y]].h; swap(ans[x][y],ans[p][q]); st.insert({sum_h[x],x}); st.insert({sum_h[p],p}); bool ok=true; rep(i,3){ if(tree[min(2,i+1)][ans[x][i+1]].w<=tree[min(2,i)][ans[x][i]].w){ ok=false; break; } } rep(i,3){ if(tree[min(2,i+1)][ans[p][i+1]].w<=tree[min(2,i)][ans[p][i]].w){ ok=false; break; } } int new_score=(*st.rbegin()).first-(*st.begin()).first; double temp=3.0+(0.1-3.0)*(double)ms/300.0; double prob=exp((double)(min_score-new_score)/temp); if(ok&&1.0*(double)mt()/(double)mt19937::max()> N >> K; tree.resize(3); tree[1].resize(N); tree[2].resize(2*N); tree[0].resize(N); rep(i,N) cin >> tree[1][i].w; rep(i,N) cin >> tree[1][i].h; rep(i,2*N) cin >> tree[2][i].w; rep(i,2*N) cin >> tree[2][i].h; rep(i,N) cin >> tree[0][i].w; rep(i,N) cin >> tree[0][i].h; Solver.solve(); }