Advertisement
GerONSo

Untitled

Dec 3rd, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.29 KB | None | 0 0
  1. /*
  2. --┬-- | | --┬-- | |
  3. | |\ | | | |
  4. | | \ | | -----> | |
  5. | | \ | | | |
  6. | | \ | | | |
  7. --┴-- | \| | └---- └----
  8.  
  9. */
  10.  
  11. // #define pragma
  12.  
  13. #ifdef pragma
  14. #pragma GCC optimize("Ofast")
  15. #pragma GCC optimize("no-stack-protector")
  16. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  17. #pragma GCC optimize("unroll-loops")
  18. #pragma GCC diagnostic ignored "-Wunused-result"
  19. #endif // pragma
  20.  
  21. #include<bits/stdc++.h>
  22. #include <ext/pb_ds/assoc_container.hpp>
  23. #include <ext/pb_ds/tree_policy.hpp>
  24.  
  25. #define ll long long
  26. #define all(x) begin(x), end(x)
  27. #define pb push_back
  28. #define x first
  29. #define y second
  30. #define int long long
  31. #define zero(x) memset(x, 0, sizeof(x))
  32.  
  33. using namespace std;
  34. using namespace __gnu_pbds;
  35.  
  36.  
  37. typedef vector<int> vi;
  38. typedef vector<bool> vb;
  39. typedef pair<int, int> pii;
  40. typedef long double ld;
  41. typedef vector<vi> matrix;
  42. typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
  43.  
  44. const int INF = 1e9 + 7;
  45. const ld EPS = 1e-9;
  46. const ld PI = atan2(0, -1);
  47.  
  48. void seriy() {
  49. ios::sync_with_stdio(0);
  50. cin.tie(0);
  51. cout.tie(0);
  52. cout << fixed << setprecision(10);
  53. #if 1
  54. freopen("input", "r", stdin);
  55. freopen("output", "w", stdout);
  56. #endif
  57. }
  58.  
  59. struct p {
  60. int l, r, c;
  61. };
  62.  
  63. struct pt {
  64. int x, left, c, num;
  65. };
  66.  
  67. bool cmp(pt a, pt b) {
  68. return a.x < b.x || a.x == b.x && a.c > b.c;
  69. }
  70.  
  71. signed main() {
  72. seriy();
  73. int n;
  74. cin >> n;
  75. vector<p> seg(n);
  76. vector<pt> a;
  77. for(int i = 0; i < n; i++) {
  78. cin >> seg[i].l >> seg[i].r >> seg[i].c;
  79. a.pb({seg[i].l, -1, 0, i + 1});
  80. a.pb({seg[i].l + seg[i].r, seg[i].l, seg[i].c, i + 1});
  81. }
  82. if(n == 1) {
  83. return cout << seg[0].c << "\n1\n1", 0;
  84. }
  85. sort(all(a), cmp);
  86. vi dp(2 * n);
  87. map<int, int> mp;
  88. vector<pii> p(2 * n);
  89. p[0] = {-1, a[0].num};
  90. // cerr << " 0 ";
  91. for(int i = 1; i < 2 * n; i++) {
  92. if(a[i].left == -1) {
  93. dp[i] = dp[i - 1];
  94. mp[a[i].x] = i;
  95. if(a[i - 1].left == -1) {
  96. p[i] = p[i - 1];
  97. }
  98. else {
  99. p[i] = {i - 1, a[i].num};
  100. }
  101. }
  102. else {
  103. dp[i] = dp[mp[a[i].left]] + a[i].c;
  104. p[i] = {mp[a[i].left], a[i].num};
  105. if(dp[i - 1] > dp[i]) {
  106. dp[i] = dp[i - 1];
  107. p[i] = p[i - 1];
  108. }
  109. }
  110. // cerr << dp[i] << " ";
  111. }
  112. // cerr << '\n';
  113. int cur = 0;
  114. for(int i = 0; i < 2 * n; i++) {
  115. // cerr << p[i] << " ";
  116. if(dp[i] > dp[cur]) {
  117. cur = i;
  118. }
  119. }
  120. cout << dp[cur] << '\n';
  121. vi ans;
  122. // cerr << '\n';
  123. while(cur >= 0) {
  124. // cerr << cur << " ";
  125. if(a[cur].left != -1) ans.pb(p[cur].y);
  126. cur = p[cur].x;
  127. }
  128. reverse(all(ans));
  129. cout << ans.size() << '\n';
  130. for(int i = 0; i < ans.size(); i++) {
  131. cout << ans[i] << " ";
  132. }
  133. return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement