Advertisement
Korotkodul

Задача №3356. Минимальное покрытие

Oct 24th, 2021
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <map>
  6. #include <set>
  7. #include <string>
  8. #include <stdio.h>
  9. #include <sstream>
  10. #include <iomanip>
  11. using namespace std;
  12. using ll = long long;
  13. #define pshb(f) push_back(f)
  14.  
  15. void ct(vector <pair <int, int> >& v) {
  16.     for (auto x : v) cout << x.first << ' ' << x.second << "  ";
  17.     cout << '\n' << '\n';
  18. }
  19.  
  20. void cp(pair <int, int> x) {
  21.     cout << x.first << ' ' << x.second << '\n' << '\n';
  22. }
  23.  
  24. bool cmp(pair <int, int> a, pair <int, int> b) {
  25.     return a.first <b.first || a.first == b.first && a.second > b.second;
  26. }
  27.  
  28. int main()
  29. {
  30.     ios_base::sync_with_stdio(false);
  31.     cin.tie(0);
  32.     int m;
  33.     cin >> m;
  34.     vector <pair <int, int>> x;
  35.     while (true) {
  36.         int a, b;
  37.         cin >> a >> b;
  38.         if (a == 0 && b == 0) break;
  39.         if (a < m && b > 0) x.push_back({ a,b });
  40.     }
  41.     sort(x.begin(), x.end(),cmp);
  42.     int sz = (int)x.size();
  43.     vector <pair <int, int>> ans;
  44.     pair <int, int> A, B, lst_B = { 999, -1e5 }, tkn = { -1, 0 };
  45.     //tkn-last taken
  46.     int i = -1;
  47.     pair <int, int> lst_ans;
  48.     while (i < sz) {
  49.         if (i == -1) {
  50.             if (!x.empty()) {
  51.                 if (x[0].first > 0) break;
  52.             }
  53.             while (i < sz) {
  54.                 ++i;
  55.                 if (i == sz) break;
  56.                 B = x[i];
  57.                 //cout << "B = ";
  58.                 //cp(B);
  59.                 if (B.first <= 0) {
  60.                     //cout << "ONE\n";
  61.                     if (B.second > lst_B.second) {
  62.                         //cout << "TWO\n";
  63.                         lst_B = B;
  64.                         if (i == sz - 1) ans.pshb(lst_B);
  65.                     }
  66.                 }
  67.                 else {
  68.                     //cout << "lst_B = ";
  69.                     //cp(lst_B);
  70.                     ans.pshb(lst_B);
  71.                     tkn = lst_B;
  72.                     break;
  73.                 }
  74.             }
  75.         }
  76.         else {
  77.             auto A = x[i];
  78.             if (A.first > tkn.second) break;
  79.             //cout << "A = ";
  80.             //cp(A);
  81.             /*if ((int)ans.size() > 0) {
  82.                 cout << "last in ans = ";
  83.                 cp(ans[(int)ans.size() - 1]);
  84.             }*/
  85.             if ((int)ans.size() >= 1) {
  86.                 lst_ans = ans[(int)ans.size() - 1];
  87.                 if (lst_ans.second >= m) break;
  88.             }
  89.             ans.pshb(A);
  90.             lst_ans = ans[(int)ans.size() - 1];
  91.             if (lst_ans.second >= m) break;
  92.             /*if ((int)ans.size() > 0) {
  93.                 cout << "last in ans = ";
  94.                 cp(ans[(int)ans.size() - 1]);
  95.             }*/
  96.             while (i < sz) {
  97.                 ++i;
  98.                 if (i == sz) break;
  99.                 B = x[i];
  100.                 //cout << "B = ";
  101.                 //cp(B);
  102.                 if (B.first <= A.second) {
  103.                     //cout << "ONE\n";
  104.                     if (B.second > lst_B.second) {
  105.                         //cout << "TWO\n";
  106.                         lst_B = B;
  107.                         if (i == sz - 1) ans.pshb(lst_B);
  108.                     }
  109.                 }
  110.                 else {
  111.                     //cout << "lst_B = ";
  112.                     //cp(lst_B);
  113.                     ans.pshb(lst_B);
  114.                     tkn = lst_B;
  115.                     break;
  116.                 }
  117.             }
  118.         }
  119.        
  120.     }
  121.     if ((int)ans.size() >= 1) {
  122.         lst_ans = ans[(int)ans.size() - 1];
  123.     }
  124.     //cout << "taken sections num = " << (int)ans.size() << '\n';
  125.     //ct(ans);
  126.     if ((int)ans.size() == 0 || lst_ans.second < m) {
  127.         cout << "No solution\n";
  128.     }
  129.     else {
  130.         cout << (int)ans.size() << '\n';
  131.         for (auto y : ans) {
  132.             cout << y.first << ' ' << y.second << '\n';
  133.         }
  134.     }
  135. }
  136. //WA
  137. /*
  138. 100
  139. -1 1
  140. 1 99
  141. 99 101
  142. 0 100
  143. 0 0
  144. */
  145. /*
  146. 100
  147. 0 20
  148. 10 50
  149. 50 70
  150. 0 0
  151. */
  152. /*
  153. 100
  154. -10 10
  155. 5 30
  156. 20 50
  157. 30 70
  158. 30 80
  159. 50 70
  160. 50 110
  161. 90 120
  162. 0 0
  163. */
  164. //smth bad with idx
  165. /*
  166. 100
  167. 0 20
  168. 10 50
  169. 50 70
  170. 80 90
  171. 90 110
  172. 0 0
  173. */
  174. //check what takes
  175. /*
  176. /*
  177. 100
  178. 0 20
  179. 10 50
  180. 50 70
  181. 80 90
  182. 90 110
  183. 70 85
  184. 0 0
  185. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement