Submission #217531

#TimeUsernameProblemLanguageResultExecution timeMemory
217531extraterrestrial별자리 3 (JOI20_constellation3)C++14
100 / 100
688 ms50424 KiB
#include <bits/stdc++.h> typedef long long ll; typedef long double ld; using namespace std; #define F first #define S second #define pb push_back #define all(x) (x).begin(), (x).end() #define SZ(x) (int)(x).size() #define int ll const int N = 2e5 + 10; int p[N], l[N], r[N], sz[N]; void init(int n) { for (int i = 1; i <= n; i++) { p[i] = l[i] = r[i] = i; sz[i] = 1; } } int find(int v) { return p[v] == v ? v : p[v] = find(p[v]); } void merge(int a, int b) { a = find(a), b = find(b); if (a == b) { return; } if (sz[a] < sz[b]) { swap(a, b); } sz[a] += sz[b]; p[b] = a; l[a] = min(l[a], l[b]); r[a] = max(r[a], r[b]); } int t[4 * N], f[4 * N]; void push(int v) { t[2 * v] += f[v]; t[2 * v + 1] += f[v]; f[2 * v] += f[v]; f[2 * v + 1] += f[v]; f[v] = 0; } void update(int v, int l, int r, int a, int b, int delta) { if (l > b || r < a) { return; } if (l >= a && r <= b) { t[v] += delta; f[v] += delta; return; } push(v); int mid = (l + r) / 2; update(2 * v, l, mid, a, b, delta); update(2 * v + 1, mid + 1, r, a, b, delta); t[v] = max(t[2 * v], t[2 * v + 1]); } int get_max(int v, int l, int r, int a, int b) { if (l > b || r < a) { return 0; } if (l >= a && r <= b) { return t[v]; } push(v); int mid = (l + r) / 2; return max(get_max(2 * v, l, mid, a, b), get_max(2 * v + 1, mid + 1, r, a, b)); } vector<int> add[N]; vector<pair<int, int>> have[N], kek[N]; bool active[N]; signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; for (int i = 1; i <= n; i++) { int x; cin >> x; add[x + 1].pb(i); } int m; cin >> m; int all = 0; for (int i = 1; i <= m; i++) { int x, y, c; cin >> x >> y >> c; all += c; have[x].pb({y, c}); } for (int i = 1; i <= n; i++) { sort(all(have[i])); int prv = 0; for (auto it : have[i]) { if (it.S > prv) { kek[it.F].pb({i, it.S - prv}); prv = it.S; } } } init(n); for (int i = 1; i <= n; i++) { for (int x : add[i]) { int mx_l = get_max(1, 1, n, l[find(x - 1)], r[find(x - 1)]), mx_r = get_max(1, 1, n, l[find(x + 1)], r[find(x + 1)]); if (active[x - 1]) { update(1, 1, n, l[find(x - 1)], r[find(x - 1)], mx_r); merge(x - 1, x); } if (active[x + 1]) { update(1, 1, n, l[find(x + 1)], r[find(x + 1)], mx_l); merge(x, x + 1); } update(1, 1, n, x, x, mx_l + mx_r); active[x] = true; } for (auto it : kek[i]) { update(1, 1, n, it.F, it.F, it.S); } } int sum = 0; for (int i = 1; i <= n; i++) { if (find(i) == i) { sum += get_max(1, 1, n, l[i], r[i]); } } cout << all - sum << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...