Advertisement
ivnikkk

Untitled

Dec 30th, 2022
1,112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "bits/stdc++.h"
  3. using namespace std;
  4. #define all(a) a.begin(), a.end()
  5. #define int long long
  6. const int inf = 1e18;
  7. const int N = 1e5 + 100;
  8. struct Line {
  9.     int b, k, ind;
  10.     Line(int _b, int _k) : b(_b), k(_k) {}
  11.     Line(int _b, int _k, int ind_) : b(_b), k(_k), ind(ind_) {}
  12.     Line() {
  13.         b = 1e18;
  14.         k = 0;
  15.     }
  16.     int get(int x) {
  17.         return k * x + b;
  18.     }
  19. };
  20. struct Node {
  21.     Line v = { inf, 0 };
  22.     Node* l = nullptr;
  23.     Node* r = nullptr;
  24.     Node* getl() {
  25.         if (l == nullptr) {
  26.             l = new Node();
  27.         }
  28.         return l;
  29.     }
  30.     Node* getr() {
  31.         if (r == nullptr) {
  32.             r = new Node();
  33.         }
  34.         return r;
  35.     }
  36. };
  37. void update(Node* t, int tl, int tr, Line u) {
  38.     int tm = (tl + tr) / 2;
  39.     bool m = t->v.get(tm) > u.get(tm),
  40.         l = t->v.get(tl) > u.get(tl);
  41.     if (tl + 1 == tr) {
  42.         return;
  43.     }
  44.     if (m) {
  45.         swap(t->v, u);
  46.     }
  47.     if (m != l) {
  48.         update(t->getl(), tl, tm, u);
  49.     }
  50.     else {
  51.         update(t->getr(), tm, tr, u);
  52.     }
  53. }
  54. void get_mn(Node* t, int tl, int tr, int x, int& res) {
  55.     res = min(res, t->v.get(x));
  56.     int tm = (tl + tr) / 2;
  57.     if (x < tm) {
  58.         if (t->l == nullptr) {
  59.             return;
  60.         }
  61.         get_mn(t->l, tl, tm, x, res);
  62.     }
  63.     else {
  64.         if (t->r == nullptr) {
  65.             return;
  66.         }
  67.         get_mn(t->r, tm, tr, x, res);
  68.     }
  69. }
  70. signed main() {
  71. #ifdef _DEBUG
  72.     freopen("input.txt", "r", stdin);
  73.     freopen("output.txt", "w", stdout);
  74. #endif
  75.     ios_base::sync_with_stdio(false);
  76.     cin.tie(nullptr);
  77.     Node* dp[3][6];
  78.     for (int i = 0; i < 3; i++) {
  79.         for (int j = 0; j < 6; j++) {
  80.             dp[i][j] = new Node();
  81.         }
  82.     }
  83.     int n, ans = inf; cin >> n;
  84.     for (int i = 0; i < n; i++) {
  85.         int q, t; cin >> q >> t;
  86.         int dp_now = (i == 0 ? 0 : inf);
  87.         for (int t_f = 1; t_f <= 3; t_f++) {
  88.             int x = i / (2 * t_f);
  89.             get_mn(dp[t_f - 1][i % (2 * t_f)], -N, N, x, dp_now);
  90.         }
  91.         update(dp[t - 1][i % (2 * t)], -N, N, Line(-q * (i / (2 * t)) + dp_now, q));
  92.         ans = min(ans, dp_now + q * ((n - i) / (2 * t) + 1));
  93.         //cout << dp_now << '\n';
  94.     }
  95.     cout << ans;
  96. }
  97.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement