Advertisement
WayKillerZ

MSIS-SET.cpp

Jun 4th, 2022
1,069
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <algorithm>
  4. #include <iomanip>
  5. #include <cmath>
  6. #include <cstring>
  7. #include <climits>
  8. #include <cstdlib>
  9. #include <ctime>
  10.  
  11. #include <vector>
  12. #include <set>
  13. #include <bitset>
  14. #include <map>
  15. #include <queue>
  16. #include <deque>
  17. #include <stack>
  18. #include <string>
  19.  
  20. #define PI 3.141592653589
  21.  
  22. #define int long long
  23. #define ll long long
  24. #define ull unsigned long long
  25. #define II pair<int, int>
  26. #define III pair<int, pair<int, int>>
  27. #define DI pair<double, int>
  28. #define fs first
  29. #define sc second
  30. #define mp(a, b) make_pair(a, b)
  31.  
  32. const long long LINF = 9223372036854775807;
  33. const int INF = 2147483647;
  34.  
  35. using namespace std;
  36.  
  37. struct Node {
  38.     int sum = 0;
  39.     vector<int> v;
  40.  
  41.     Node() {}
  42.     Node(int x) {
  43.         this->sum = x;
  44.         this->v.push_back(x);
  45.     }
  46.     Node(Node n, int x) {
  47.         this->sum = n.sum + x;
  48.         this->v.resize(n.v.size());
  49.         for(int i = 0; i < n.v.size(); i++) {
  50.             this->v[i] = n.v[i];
  51.         }
  52.         this->v.push_back(x);
  53.     }
  54. };
  55.  
  56. bool operator < (const Node& a, const Node& b) {
  57.     if(a.sum < b.sum) return true;
  58.     if(a.sum == b.sum) {
  59.         if(a.v.size() == 0) return true;
  60.         if(b.v.size() == 0) return false;
  61.         return a.v.back() <= b.v.back();
  62.     }
  63.     return false;
  64. }
  65.  
  66. bool cmpSum(const Node& a, const Node& b) {
  67.     if(a.sum < b.sum) return true;
  68.     if(a.sum == b.sum && a.v.back() <= b.v.back()) return true;
  69.     return false;
  70. }
  71.  
  72. bool cmpLE(const Node& a, const Node& b) {
  73.     if(a.v.size() == 0) return true;
  74.     if(b.v.size() == 0) return false;
  75.     if(a.v.back() <= b.v.back()) return true;
  76.     return false;
  77. }
  78.  
  79. void genTest(int n) {
  80.     freopen("MSIS3.INP", "w", stdout);
  81.     cout << n << endl;
  82.     for(int i = 1; i <= n; i++) cout << i << " ";
  83. }
  84.  
  85. int32_t main() {
  86.     ios_base::sync_with_stdio(false);
  87.     cin.tie(NULL); cout.tie(NULL);
  88.    
  89.     // genTest(10000);
  90.     // return 0;
  91.  
  92.     freopen("MSIS3.INP", "r", stdin);
  93.     freopen("MSIS3.OUT", "w", stdout);
  94.  
  95.     int n, inp;
  96.     cin >> n >> inp;
  97.  
  98.     set<Node> S;
  99.     S.insert(Node());
  100.     S.insert(Node(inp));
  101.    
  102.     vector<set<Node>::iterator> toErase;
  103.     for (int i = 0; i < n-1; i++) {
  104.         cin >> inp;
  105.         set<Node>::iterator s_less =
  106.             --upper_bound(S.begin(), S.end(), Node(inp), cmpLE);
  107.         Node ns = Node(*s_less, inp);
  108.         set<Node>::iterator s_more =
  109.             lower_bound(S.begin(), S.end(), ns, cmpSum);
  110.  
  111.         ++s_less;
  112.         while(s_less != s_more) toErase.push_back(s_less++);
  113.         for(int j = 0; j < toErase.size(); j++) S.erase(toErase[j]);
  114.         toErase.clear();
  115.         S.insert(ns);
  116.     }
  117.  
  118.     // for(auto& au : S) {
  119.     //     cout << au.sum << endl;
  120.     //     for(int i = 0; i < au.v.size(); i++) {
  121.     //         cout << au.v[i] << " ";
  122.     //     }
  123.     //     cout << endl << endl;
  124.     // }
  125.     cout << (--S.end())->sum << endl;
  126.  
  127.     return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement