[C++] Solution with explanations
From colsum, we have several observations\n\t 0 can be ignored since both values in that column must be 0.\n\t 2 can also be ignored since both values in that c
* From ```colsum```, we have several observations\n\t* ```0``` can be ignored since both values in that column must be 0.\n\t* ```2``` can also be ignored since both values in that column must be 1.\n\t\t* Thus, we decrease both ```upper``` and ```lower``` by 1 and move on.\n\t* We only care about ```1```.\n* If ```upper``` or ```lower``` is negative, we cannot construct.\n* If the sum of ```upper``` and ```lower``` is not equal to the number of 1, we cannot construct.\n* Otherwise, we can.\n\n```\nclass Solution {\npublic:\n    vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {\n        int ones(0);\n        for (const int& col: colsum)\n            if (col == 2) {\n                if ((--upper) < 0 || (--lower) < 0) return {};\n            } else if (col == 1) {\n                ones++;\n            }\n        \n        if (upper + lower != ones) return {};\n        \n        vector<vector<int>> ans(2, vector<int>(colsum.size()));\n        \n        for (int i = 0; i < colsum.size(); ++i)\n            if (colsum[i] == 2)\n                ans[0][i] = ans[1][i] = 1;\n            else if (colsum[i] == 1)\n                (upper > 0 && upper--) ? ans[0][i] = 1 : ans[1][i] = 1;\n        \n        return ans;\n    }\n};\n```
['Greedy']