Submission #213326

#TimeUsernameProblemLanguageResultExecution timeMemory
213326IOrtroiiiConstellation 3 (JOI20_constellation3)C++14
100 / 100
361 ms72952 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 200200;
const int LG = 18;
using ll = long long;

int N, M;
int A[MAXN];
int rmq[LG][MAXN];

int best(int x, int y) {
   if (A[x] > A[y]) return x;
   else return y;
}

ll ans[MAXN], offset[MAXN];
multiset<pair<int, ll>> vals[MAXN];

int get(int l, int r) {
   int lg = __lg(r - l + 1);
   return best(rmq[lg][l], rmq[lg][r - (1 << lg) + 1]);
}

int solve(int l, int r, int lim) {
   int v;
   if (l == r) {
      v = l;
   } else {
      int md = get(l, r);
      v = solve(md, md, A[md]);
      if (l < md) {
         int u = solve(l, md - 1, A[md]);
         if (vals[v].size() < vals[u].size()) {
            swap(v, u);
         }
         for (auto z : vals[u]) {
            vals[v].emplace(z.first, z.second + ans[v] - ans[u]);
         }
         offset[v] += offset[u] + ans[u];
      }
      if (md < r) {
         int u = solve(md + 1, r, A[md]);
         if (vals[v].size() < vals[u].size()) {
            swap(v, u);
         }
         for (auto z : vals[u]) {
            vals[v].emplace(z.first, z.second + ans[v] - ans[u]);
         }
         offset[v] += offset[u] + ans[u];
      }
   }
   while (!vals[v].empty() && vals[v].begin()->first <= lim) {
      ans[v] = max(ans[v], vals[v].begin()->second);
      vals[v].erase(vals[v].begin());
   }
   return v;
}

int main() {
   ios_base::sync_with_stdio(false); cin.tie(nullptr);
   cin >> N;
   for (int i = 0; i < N; ++i) {
      cin >> A[i];
      rmq[0][i] = i;
   }
   for (int i = 1; i < LG; ++i) {
      for (int j = 0; j + (1 << i) <= N; ++j) {
         rmq[i][j] = best(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
      }
   }
   cin >> M;
   ll sum = 0;
   while (M--) {
      int x, y; ll c;
      cin >> x >> y >> c;
      vals[--x].emplace(y, c);
      sum += c;
   }
   int v = solve(0, N - 1, N + 1);
   cout << sum - (ans[v] + offset[v]) << "\n";
   return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...