#include using namespace std; //#define DEBUG typedef struct wood{ int id; int width; int height; }wood; bool compare(wood a, wood b){ if(a.width!=b.width){ return a.width> n >> k; //高さの合計 int sum=0; //「木の先端」 vector wooden_head(n); //「木の先端」の幅 for(int i=0;i> wooden_head[i].width; } //「木の先端」の高さ for(int i=0;i> wooden_head[i].height; sum+=wooden_head[i].height; } //ソート sort(wooden_head.begin(),wooden_head.end(),compare); //「木の中央」 vector wooden_central(2*n); //「木の中央」の幅 for(int i=0;i<2*n;i++){ wooden_central[i].id=i+1; cin >> wooden_central[i].width; } //「木の中央」の高さ for(int i=0;i<2*n;i++){ cin >> wooden_central[i].height; sum+=wooden_central[i].height; } //ソート sort(wooden_central.begin(),wooden_central.end(),compare); //「木の幹」 vector wooden_trunk(n); //「木の幹」の幅 for(int i=0;i> wooden_trunk[i].width; } //「木の幹」の高さ for(int i=0;i> wooden_trunk[i].height; sum+=wooden_trunk[i].height; } //ソート sort(wooden_trunk.begin(),wooden_trunk.end(),compare); //木の高さの平均 int avg=(sum+n/2)/n; #ifdef DEBUG for(wood w:wooden_head){ cout << w.id << ' '; } cout << endl; for(wood w:wooden_central){ cout << w.id << ' '; } cout << endl; for(wood w:wooden_trunk){ cout << w.id << ' '; } cout << endl; #endif vector> woods(k,vector(4)); //幹は幅小⇒大、中央は幅大⇒小に確定させていく int j=0; while(j,vector>,greater>> Q; j=0; while(j S; //確定した先端の番号 while(!Q.empty()){ pair q=Q.top(); Q.pop(); vector w=woods[q.second]; //中央2個と幹の高さ int height=0; for(int _=1;_<4;_++)height+=w[_].height; //先端探索開始位置 //int c=(j?woods[j-1][0].id:0); int c=0; while(S.count(wooden_head[c].id) || wooden_head[c].width<=w[3].width){//先端の幅>幹の幅になるまでループ c++; } //暫定 w[0]=wooden_head[c]; while(wooden_head[++c].width=n)break; } //出力 for(int _=0;_<4;_++){ if(_)cout << ' '; cout << w[_].id; } cout << endl; S.insert(w[0].id); } return 0; }