解法

$4$を法として$0$になるよう調整してから高く積む。 $O(\mathrm{surface})$。 $\mathrm{surface} = 10$のふたつに分離するケースはコーナーっぽいので注意。

実装

#include <bits/stdc++.h>
using namespace std;
class CubesOnATable { public: vector<int> placeCubes(int surface); };

vector<int> CubesOnATable::placeCubes(int surface) {
    vector<int> answer;
    map<pair<int, int>, int> height;
    auto push = [&](int x, int y) {
        auto p = make_pair(x, y);
        int z = height[p];
        answer.push_back(x);
        answer.push_back(y);
        answer.push_back(z);
        ++ height[p];
    };
    switch (surface % 4) {
        case 0:
            if (surface < 8) return vector<int>();
            push(0, 0);
            push(0, 1);
            surface -= 8;
            break;
        case 1:
            if (surface < 5) return vector<int>();
            push(0, 0);
            surface -= 5;
            break;
        case 2:
            if (surface < 10) return vector<int>();
            push(0, 0);
            push(0, 2);
            surface -= 10;
            break;
        case 3:
            if (surface < 11) return vector<int>();
            push(0, 0);
            push(0, 1);
            push(0, 2);
            surface -= 11;
            break;
    }
    for (; surface; surface -= 4) {
        push(0, 0);
    }
    return answer;
}