Submission #721601

#TimeUsernameProblemLanguageResultExecution timeMemory
721601pavementConstellation 3 (JOI20_constellation3)C++17
100 / 100
710 ms103500 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define int long long #define mp make_pair #define mt make_tuple #define pb push_back #define ppb pop_back #define eb emplace_back #define g0(a) get<0>(a) #define g1(a) get<1>(a) #define g2(a) get<2>(a) #define g3(a) get<3>(a) #define g4(a) get<4>(a) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); using db = double; using ll = long long; using ld = long double; using ii = pair<int, int>; using iii = tuple<int, int, int>; using iiii = tuple<int, int, int, int>; using iiiii = tuple<int, int, int, int, int>; template<class key, class value = null_type, class cmp = less<key> > using ordered_set = tree<key, value, cmp, rb_tree_tag, tree_order_statistics_node_update>; int N, M, idx, tot, A[200005], X[200005], Y[200005], C[200005], min_l[200005], min_r[200005], lab[200005], L[200005], R[200005], H[200005], ft1[200005], ft2[200005], a[200005], b[200005], sz[200005], anc[25][200005]; stack<int> S; vector<int> adj[200005], vec[200005]; void construct(int l, int r, int par = -1) { if (l > r) return; int cur = ++idx; if (par != -1) { adj[par].pb(cur); } int mid = -1; for (int i = l, j = r; i <= j; i++, j--) { if (min_l[i] < l && min_r[i] > r) { mid = i; break; } if (min_l[j] < l && min_r[j] > r) { mid = j; break; } } assert(mid != -1); L[cur] = l; R[cur] = r; H[cur] = A[mid] + 1; lab[mid] = cur; construct(l, mid - 1, cur); construct(mid + 1, r, cur); } int dfs(int n) { for (int k = 1; k <= 20; k++) { if (anc[k - 1][n] == -1) break; anc[k][n] = anc[k - 1][anc[k - 1][n]]; } for (auto u : adj[n]) { anc[0][u] = n; sz[n] += dfs(u); } return ++sz[n]; } inline int ls(int x) { return x & -x; } void upd1(int l, int r, int v) { for (; l <= N; l += ls(l)) ft1[l] += v; for (r++; r <= N; r += ls(r)) ft1[r] -= v; } void upd2(int l, int r, int v) { for (; l <= N; l += ls(l)) ft2[l] += v; for (r++; r <= N; r += ls(r)) ft2[r] -= v; } int qry1(int p) { int r = 0; for (; p; p -= ls(p)) r += ft1[p]; return r; } int qry2(int p) { int r = 0; for (; p; p -= ls(p)) r += ft2[p]; return r; } int dp(int n, int e = -1) { int ret = 0; for (auto u : adj[n]) ret += dp(u, n); upd1(n, n + sz[n] - 1, ret); for (auto i : vec[n]) ret = max(ret, qry1(a[i]) + qry1(b[i]) - qry1(n) - (qry2(a[i]) + qry2(b[i]) - qry2(n)) + C[i]); upd2(n, n + sz[n] - 1, ret); return ret; } main() { memset(anc, -1, sizeof anc); ios::sync_with_stdio(0); cin.tie(0); cin >> N; for (int i = 1; i <= N; i++) { cin >> A[i]; } cin >> M; for (int i = 1; i <= M; i++) { cin >> X[i] >> Y[i] >> C[i]; tot += C[i]; } for (int i = 1; i <= N; i++) { while (!S.empty() && A[S.top()] <= A[i]) S.pop(); min_l[i] = (S.empty() ? 0 : S.top()); S.push(i); } while (!S.empty()) S.pop(); for (int i = N; i >= 1; i--) { while (!S.empty() && A[S.top()] <= A[i]) S.pop(); min_r[i] = (S.empty() ? N + 1 : S.top()); S.push(i); } construct(1, N); dfs(1); for (int i = 1; i <= M; i++) { assert(H[lab[X[i]]] <= Y[i]); int cur = lab[X[i]]; for (int k = 20; k >= 0; k--) { if (anc[k][cur] != -1 && H[anc[k][cur]] <= Y[i]) { cur = anc[k][cur]; } } a[i] = lab[X[i]]; b[i] = cur; vec[b[i]].pb(i); } cout << tot - dp(1) << '\n'; }

Compilation message (stderr)

constellation3.cpp:104:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  104 | main() {
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...