#include #include #include #include #include #include using namespace std; const int MAXN = 1e6; mt19937 rnd(22); struct Stick { int64_t h, p; int ind; }; int n; int64_t b; Stick sticks[MAXN + 5]; int main() { #ifndef __LOCAL__ ifstream cin("sticks.in"); ofstream cout("sticks.out"); #endif ios::sync_with_stdio(false); cin.tie(nullptr); int64_t bestScore = numeric_limits::max(); vector> bestSetup; cin >> n >> b; for (int i = 0; i < n; i++) { cin >> sticks[i].h; sticks[i].ind = i; } for (int i = 0; i < n; i++) { cin >> sticks[i].p; } int startExecution = clock(); while (clock() - startExecution < 3 * 1000) { shuffle(sticks, sticks + n, rnd); int64_t lastSum = 0; vector> setup = {{}}; int64_t penalty = 0; for (int i = 0; i < n; i++) { if (lastSum >= b) { lastSum = 0; setup.push_back({}); } if (lastSum + sticks[i].h > b) { penalty += sticks[i].p; } lastSum += sticks[i].h; setup.back().push_back(sticks[i].ind); } int64_t k = setup.size(); int64_t score = k*k*k + penalty; if (score < bestScore) { bestScore = score; bestSetup = setup; } } cout << bestSetup.size() << '\n'; for (const vector &hole : bestSetup) { cout << hole.size(); for (int ind : hole) { cout << " " << ind + 1; } cout << '\n'; } }