제출 #1132810

#제출 시각아이디문제언어결과실행 시간메모리
1132810OI_Account별자리 3 (JOI20_constellation3)C++20
0 / 100
53 ms115008 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 200'000; const int N1 = 300; const ll INF = 1'000'000'000'000'000; int n, m, a[N + 10], x[N + 10], y[N + 10]; ll mxCol[N1 + 10][N1 + 10], dp[N1 + 10][N1 + 10][N1 + 10]; int mx[N1 + 10][N1 + 10]; vector<pair<int, ll>> vec[N + 10]; ll sum; void readInput() { 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]; ll c; cin >> c; sum += c; vec[x[i]].push_back({y[i], c}); } } void calcMx() { for (int i = 1; i <= n; i++) mx[i][i] = 1; for (int len = 2; len <= n; len++) for (int l = 1, r = len; r <= n; l++, r++) if (a[r] > a[mx[l][r - 1]]) mx[l][r] = r; else mx[l][r] = mx[l][r - 1]; } void calcVec() { for (int i = 1; i <= n; i++) { sort(vec[i].begin(), vec[i].end()); mxCol[i][0] = 0; int pnt = 0; for (int j = 1; j <= n; j++) { mxCol[i][j] = mxCol[i][j - 1]; while (pnt < vec[i].size() && vec[i][pnt].first <= j) { mxCol[i][j] = max(mxCol[i][j], vec[i][pnt].second); pnt++; } } } } void calcDP() { for (int len = 1; len <= n; len++) for (int l = 1, r = len; r <= n; l++, r++) { int mid = mx[l][r]; for (int h = 1; h <= n; h++) { if (h <= a[mid]) { dp[l][r][h] = dp[l][mid - 1][a[mid]] + dp[mid + 1][r][a[mid]]; continue; } ll caseLeft = dp[l][mid - 1][h] + dp[mid + 1][r][a[mid]]; ll caseRight = dp[l][mid - 1][a[mid]] + dp[mid + 1][r][h]; ll caseMid = dp[l][mid - 1][a[mid]] + mxCol[mid][h] + dp[mid + 1][r][a[mid]]; dp[l][r][h] = max({caseLeft, caseMid, caseRight}); } } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); readInput(); calcMx(); calcVec(); calcDP(); cout << sum - dp[1][n][n] << flush; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...