Advertisement
tiom4eg

openol I 60

Jan 16th, 2024
796
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.79 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. // tiom4eg's precompiler options
  3. // POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS
  4. // IO settings
  5. #define fastIO ios_base::sync_with_stdio(false); cin.tie(0)
  6. // Quick types
  7. #define ll long long
  8. #define ld long double
  9. //#define ull unsigned long long
  10. #define pii pair <int, int>
  11. #define vi vector <int>
  12. #define mi vector <vector <int>>
  13. // Quick functions
  14. #define endl "\n"
  15. #define F first
  16. #define S second
  17. #define all(a) a.begin(), a.end()
  18. #define sz(a) (int)(a.size())
  19. #define pb push_back
  20. #define mp make_pair
  21. // Quick fors
  22. #define FOR(i, a, b) for (int i = a; i < b; ++i)
  23. #define FORS(i, a, b, c) for (int i = a; i < b; i += c)
  24. #define RFOR(i, a, b) for (int i = a; i >= b; --i)
  25. #define EACH(e, a) for (auto& e : a)
  26. // Pragmas
  27. #ifndef TIOM4EG
  28. #pragma GCC optimize("O3") // let the chaos begin!
  29. #pragma GCC target("avx,avx2,tune=native")
  30. #pragma GCC comment(linker, "/stack:200000000")
  31. #endif
  32. // PBDS
  33. #include <ext/pb_ds/assoc_container.hpp>
  34. #include <ext/pb_ds/tree_policy.hpp>
  35. #define pbds tree <int, null_type, less <int>, rb_tree_tag, tree_order_statistics_node_update>
  36. using namespace __gnu_pbds;
  37. // POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS
  38. using namespace std;
  39. mt19937 rng(chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now().time_since_epoch()).count());
  40. //#define int long long
  41. constexpr int INF = 1e9 + 7, MD = 998244353, MAX = 2007, LG = 18, R = 1 << LG, MOD = 1000000007, MOD2 = 1e9 + 9, B = 256;
  42. const ll INFLL = 1e18 + 7;
  43.  
  44. struct state {
  45.     ll v;
  46.     int cl;
  47.     char ml, mr;
  48.     state() : v(-INFLL) {}
  49.     state(ll a, int b, char c, char d) : v(a), cl(b), ml(c), mr(d) {}
  50. };
  51.  
  52. void conv(vector <state>& c, const vector <state>& a, const vector <state>& b, char ml, char mr) {
  53.     int i = 0, j = 0;
  54.     if (a[0].v + b[0].v > c[0].v) c[0] = state(a[0].v + b[0].v, 0, ml, mr);
  55.     FOR(k, 1, sz(a) + sz(b) - 1) {
  56.         if (j == sz(b) - 1 || (i != sz(a) - 1 && a[i + 1].v + b[j].v > a[i].v + b[j + 1].v)) ++i;
  57.         else ++j;
  58.         if (a[i].v + b[j].v > c[k].v) c[k] = state(a[i].v + b[j].v, i, ml, mr);
  59.     }
  60. }
  61.  
  62. ll w[200007];
  63. vector <state> dp[2 * R][4]; // dp[i][0] - whole, dp[i][1] - w/o first, dp[i][2] - w/o last, dp[i][3] - w/o first & last; 0 >= 1, 0 >= 2, 1 >= 3, 2 >= 3
  64.  
  65. void dac(int l, int r, int v = 1) {
  66.     dp[v][0].resize(1 + (r - l + 1) / 2);
  67.     dp[v][1].resize(1 + (r - l) / 2);
  68.     dp[v][2].resize(1 + (r - l) / 2);
  69.     dp[v][3].resize(1 + (r - l - 1) / 2);
  70.     if (l + 1 == r) {
  71.         dp[v][0][0] = state(0, 0, 0, 0);
  72.         dp[v][0][1] = state(w[l], 1, 0, 0);
  73.         dp[v][1][0] = state(0, 0, 0, 0);
  74.         dp[v][2][0] = state(0, 0, 0, 0);
  75.         dp[v][3][0] = state(0, 0, 0, 0);
  76.         return;
  77.     }
  78.     int m = (l + r) / 2;
  79.     dac(l, m, 2 * v), dac(m, r, 2 * v + 1);
  80.     conv(dp[v][0], dp[2 * v][0], dp[2 * v + 1][1], 0, 1);
  81.     conv(dp[v][0], dp[2 * v][2], dp[2 * v + 1][0], 2, 0);
  82.     conv(dp[v][1], dp[2 * v][3], dp[2 * v + 1][0], 3, 0);
  83.     conv(dp[v][1], dp[2 * v][1], dp[2 * v + 1][1], 1, 1);
  84.     conv(dp[v][2], dp[2 * v][0], dp[2 * v + 1][3], 0, 3);
  85.     conv(dp[v][2], dp[2 * v][2], dp[2 * v + 1][2], 2, 2);
  86.     conv(dp[v][3], dp[2 * v][3], dp[2 * v + 1][2], 3, 2);
  87.     conv(dp[v][3], dp[2 * v][1], dp[2 * v + 1][3], 1, 3);
  88. }
  89.  
  90. vi ans;
  91. void restore(int l, int r, int k, char c, int v = 1) {
  92.     if (l + 1 == r) {
  93.         ans.pb(l);
  94.         return;
  95.     }
  96.     int m = (l + r) / 2;
  97.     if (dp[v][c][k].cl) restore(l, m, dp[v][c][k].cl, dp[v][c][k].ml, 2 * v);
  98.     if (k - dp[v][c][k].cl) restore(m, r, k - dp[v][c][k].cl, dp[v][c][k].mr, 2 * v + 1);
  99. }
  100.  
  101. #define int long long
  102.  
  103. vi g[MAX];
  104. int es[MAX], vw[MAX], ew[MAX], par[MAX], sub[MAX];
  105. int dp2[2][MAX][MAX]; // took edge?, vertex, how many took
  106. int tmp[2][MAX];
  107.  
  108. void dfs(int v, int p = -1) {
  109.     sub[v] = 1;
  110.     EACH(id, g[v]) {
  111.         int u = es[id] - v;
  112.         if (u == p) {
  113.             par[v] = id;
  114.             continue;
  115.         }
  116.         dfs(u, v);
  117.         sub[v] += sub[u];
  118.     }
  119.     dp2[0][v][0] = 0;
  120.     FOR(i, 0, sub[v]) tmp[0][i] = tmp[1][i] = -INFLL;
  121.     EACH(id, g[v]) if (id != par[v]) {
  122.         int u = es[id] - v;
  123.         // not took v->u
  124.         FOR(pr, 0, sub[u]) {
  125.             RFOR(i, sub[v] - 1, pr + (pr & 1)) {
  126.                 tmp[0][i] = max(tmp[0][i], dp2[0][v][i - pr - (pr & 1)] + dp2[0][u][pr]);
  127.                 tmp[1][i] = max(tmp[1][i], dp2[1][v][i - pr - (pr & 1)] + dp2[0][u][pr]);
  128.             }
  129.         }
  130.         // took v->u
  131.         FORS(pr, 0, sub[u], 2) {
  132.             RFOR(i, sub[v] - 1, pr + 1) {
  133.                 tmp[1][i] = max(tmp[1][i], dp2[0][u][pr] + max(dp2[0][v][i - pr - 1] + vw[v], dp2[1][v][i - pr - 1]) - ew[id]);
  134.             }
  135.         }
  136.         FOR(i, 0, sub[v]) dp2[0][v][i] = max(dp2[0][v][i], tmp[0][i]), dp2[1][v][i] = max(dp2[1][v][i], tmp[1][i]);
  137.     }
  138.     FOR(i, 0, sub[v]) {
  139.         if (i & 1) {
  140.             if (~p) dp2[0][v][i] = max(dp2[0][v][i], dp2[1][v][i] - ew[par[v]]);
  141.         }
  142.         else dp2[0][v][i] = max(dp2[0][v][i], dp2[1][v][i]);
  143.     }
  144. }
  145.  
  146. #undef int
  147.  
  148. signed main() {
  149.     FOR(i, 0, MAX) FOR(j, 0, MAX) dp2[0][i][j] = dp2[1][i][j] = -INFLL;
  150.     fastIO;
  151.     int n, k, t; cin >> n >> k >> t;
  152.     if (n <= 2000) {
  153.         FOR(i, 0, n) cin >> vw[i];
  154.         FOR(i, 1, n) {
  155.             int u, v; cin >> u >> v >> ew[i], --u, --v;
  156.             es[i] = u + v;
  157.             g[u].pb(i), g[v].pb(i);
  158.         }
  159.         dfs(0);
  160.         cout << dp2[0][0][2 * k];
  161.         return 0;
  162.     }
  163.     vi a(n); EACH(e, a) cin >> e;
  164.     vi b(n - 1); FOR(i, 0, n - 1) cin >> b[i] >> b[i] >> b[i];
  165.     FOR(i, 0, n - 2) w[i] = a[i + 1] - b[i] - b[i + 1];
  166.     dac(0, n - 2, 1);
  167.     cout << dp[1][0][k].v << endl;
  168.     if (t) {
  169.         restore(0, n - 2, k, 0, 1);
  170.         EACH(e, ans) cout << e + 2 << ' ' << e + 1 << ' ' << e + 3 << endl;
  171.     }
  172. }
  173.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement