Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int MAX = 1 << 15;
- int h, w;
- vector<vector<long long>> table;
- long long s;
- array<int, 2> vars{0, 1};
- array<vector<long long>, MAX> rows;
- void solve() {
- cin >> h >> w;
- table.resize(h, vector<long long>(w));
- for (auto &row : table) for (auto &v : row) cin >> v;
- cin >> s;
- for (int mask = 0; mask < (1 << w); ++mask) {
- rows[mask].assign(h, 0);
- for (int i = 0; i < h; ++i) {
- int msk = mask;
- while (msk > 0) {
- rows[mask][i] += table[i][__builtin_ctz(msk)];
- msk = msk & (msk - 1);
- }
- }
- }
- mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
- for (int width_mask = 0; width_mask < (1 << w); ++width_mask) {
- {
- vector<pair<long long, int>> a;
- for (int i = 0; i < h; ++i) {
- if (rows[width_mask][i] != 0) {
- a.emplace_back(rows[width_mask][i], i);
- }
- }
- int n = (int)a.size();
- for (int i = 0; i < 25; ++i) {
- shuffle(a.begin(), a.end(), rng);
- long long ss = s;
- for (int i = 0; i < n; ++i) {
- ss -= a[i].first;
- if (ss < 0) {
- break;
- } else if (ss == 0) {
- int height_mask = 0;
- for (int j = 0; j <= i; ++j) {
- height_mask |= (1 << a[j].second);
- }
- cout << "YES\n" << w - __builtin_popcount(width_mask) + h -__builtin_popcount(height_mask) << '\n';
- for (int i = 0; i < h; ++i) {
- if (((height_mask >> i) & 1) == 0) {
- cout << "1 " << i + 1 << '\n';
- }
- }
- for (int i = 0; i < w; ++i) {
- if (((width_mask >> i) & 1) == 0) {
- cout << "2 " << i + 1 << '\n';
- }
- }
- exit(0);
- }
- }
- }
- }
- vector<pair<long long, int>> a(h);
- for (int i = 0; i < h; ++i) {
- a[i] = {rows[width_mask][i], i};
- }
- sort(a.begin(), a.end());
- vector<long long> values(h), indices(h);
- for (int i = 0; i < h; ++i) {
- values[i] = a[i].first;
- indices[i] = a[i].second;
- }
- for (int i = h - 1; i >= 0; --i) {
- int j = i + 1;
- long long ss = s;
- int height_mask = 0;
- while (j > 0) {
- height_mask |= (1 << (indices[j - 1]));
- ss -= values[j - 1];
- j = upper_bound(values.cbegin(), values.cbegin() + j - 1, ss) - values.cbegin();
- }
- if (ss == 0) {
- cout << "YES\n" << w - __builtin_popcount(width_mask) + h -__builtin_popcount(height_mask) << '\n';
- for (int i = 0; i < h; ++i) {
- if (((height_mask >> i) & 1) == 0) {
- cout << "1 " << i + 1 << '\n';
- }
- }
- for (int i = 0; i < w; ++i) {
- if (((width_mask >> i) & 1) == 0) {
- cout << "2 " << i + 1 << '\n';
- }
- }
- exit(0);
- }
- }
- }
- cout << "NO";
- }
- int main(int argc, char **argv) {
- cin.tie(nullptr)->sync_with_stdio(false);
- int t = 1;
- // cin >> t;
- while (t--) {
- solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment