Guest User

Untitled

a guest
Jan 24th, 2024
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.91 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int MAX = 1 << 15;
  6.  
  7. int h, w;
  8. vector<vector<long long>> table;
  9.  
  10. long long s;
  11.  
  12. array<int, 2> vars{0, 1};
  13.  
  14. array<vector<long long>, MAX> rows;
  15.  
  16. void solve() {
  17. cin >> h >> w;
  18.  
  19. table.resize(h, vector<long long>(w));
  20. for (auto &row : table) for (auto &v : row) cin >> v;
  21.  
  22. cin >> s;
  23.  
  24. for (int mask = 0; mask < (1 << w); ++mask) {
  25. rows[mask].assign(h, 0);
  26. for (int i = 0; i < h; ++i) {
  27. int msk = mask;
  28. while (msk > 0) {
  29. rows[mask][i] += table[i][__builtin_ctz(msk)];
  30. msk = msk & (msk - 1);
  31. }
  32. }
  33. }
  34.  
  35. mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
  36.  
  37. for (int width_mask = 0; width_mask < (1 << w); ++width_mask) {
  38. {
  39. vector<pair<long long, int>> a;
  40. for (int i = 0; i < h; ++i) {
  41. if (rows[width_mask][i] != 0) {
  42. a.emplace_back(rows[width_mask][i], i);
  43. }
  44. }
  45.  
  46. int n = (int)a.size();
  47. for (int i = 0; i < 25; ++i) {
  48. shuffle(a.begin(), a.end(), rng);
  49.  
  50. long long ss = s;
  51. for (int i = 0; i < n; ++i) {
  52. ss -= a[i].first;
  53.  
  54. if (ss < 0) {
  55. break;
  56. } else if (ss == 0) {
  57. int height_mask = 0;
  58. for (int j = 0; j <= i; ++j) {
  59. height_mask |= (1 << a[j].second);
  60. }
  61.  
  62. cout << "YES\n" << w - __builtin_popcount(width_mask) + h -__builtin_popcount(height_mask) << '\n';
  63.  
  64. for (int i = 0; i < h; ++i) {
  65. if (((height_mask >> i) & 1) == 0) {
  66. cout << "1 " << i + 1 << '\n';
  67. }
  68. }
  69.  
  70. for (int i = 0; i < w; ++i) {
  71. if (((width_mask >> i) & 1) == 0) {
  72. cout << "2 " << i + 1 << '\n';
  73. }
  74. }
  75.  
  76. exit(0);
  77. }
  78. }
  79. }
  80. }
  81.  
  82.  
  83. vector<pair<long long, int>> a(h);
  84. for (int i = 0; i < h; ++i) {
  85. a[i] = {rows[width_mask][i], i};
  86. }
  87.  
  88. sort(a.begin(), a.end());
  89.  
  90. vector<long long> values(h), indices(h);
  91.  
  92. for (int i = 0; i < h; ++i) {
  93. values[i] = a[i].first;
  94. indices[i] = a[i].second;
  95. }
  96.  
  97. for (int i = h - 1; i >= 0; --i) {
  98. int j = i + 1;
  99. long long ss = s;
  100. int height_mask = 0;
  101. while (j > 0) {
  102. height_mask |= (1 << (indices[j - 1]));
  103.  
  104. ss -= values[j - 1];
  105.  
  106. j = upper_bound(values.cbegin(), values.cbegin() + j - 1, ss) - values.cbegin();
  107. }
  108.  
  109. if (ss == 0) {
  110. cout << "YES\n" << w - __builtin_popcount(width_mask) + h -__builtin_popcount(height_mask) << '\n';
  111.  
  112. for (int i = 0; i < h; ++i) {
  113. if (((height_mask >> i) & 1) == 0) {
  114. cout << "1 " << i + 1 << '\n';
  115. }
  116. }
  117.  
  118. for (int i = 0; i < w; ++i) {
  119. if (((width_mask >> i) & 1) == 0) {
  120. cout << "2 " << i + 1 << '\n';
  121. }
  122. }
  123.  
  124. exit(0);
  125. }
  126. }
  127. }
  128.  
  129. cout << "NO";
  130. }
  131.  
  132. int main(int argc, char **argv) {
  133. cin.tie(nullptr)->sync_with_stdio(false);
  134.  
  135. int t = 1;
  136. // cin >> t;
  137. while (t--) {
  138. solve();
  139. }
  140.  
  141. return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment