Submission #1221733

#TimeUsernameProblemLanguageResultExecution timeMemory
1221733AmirAli_H1Shortcut (IOI16_shortcut)C++17
38 / 100
572 ms840 KiB
// In the name of Allah #include <bits/stdc++.h> #include "shortcut.h" using namespace std; typedef long long int ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef complex<ld> cld; #define all(x) (x).begin(),(x).end() #define len(x) ((ll) (x).size()) #define F first #define S second #define pb push_back #define sep ' ' #define endl '\n' #define Mp make_pair #define kill(x) cout << x << '\n', exit(0) #define set_dec(x) cout << fixed << setprecision(x); #define file_io(x,y) freopen(x, "r", stdin); freopen(y, "w", stdout); mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int maxn = 1500 + 4; const ll oo = 1e18 + 4; const int maxlg = 12; int n; ll w; ll A[maxn], D[maxn], A1[maxn], A2[maxn]; ll valx[maxn], valD[maxn]; ll M1[maxn][maxlg], M2[maxn][maxlg]; ll get_max1(int l, int r) { if (r - l <= 0) return -oo; int j = __lg(r - l); return max(M1[l][j], M1[r - (1 << j)][j]); } ll get_max2(int l, int r) { if (r - l <= 0) return -oo; int j = __lg(r - l); return max(M2[l][j], M2[r - (1 << j)][j]); } ll cal1(int i, int x, int l, int r) { ll res = -oo; if (x == 0) return res; if (i - x >= l) { res = max(res, A[i] + (D[i] + get_max2(i - x, i))); } else { res = max(res, A[i] + (D[i] + get_max2(l, i))); x -= (i - l); res = max(res, A[i] + (D[i] - D[l]) + w + (D[r] + get_max2(r - x + 1, r + 1))); } return res; } ll cal2(int i, int x, int l, int r) { ll res = -oo; if (x == 0) return res; if (i + x <= r) { res = max(res, A[i] + (get_max1(i + 1, i + x + 1) - D[i])); } else { res = max(res, A[i] + (get_max1(i + 1, r + 1) - D[i])); x -= (r - i); res = max(res, A[i] + (D[r] - D[i]) + w + (get_max1(l, l + x) - D[l])); } return res; } ll calD(int m, int i, int j) { if (i == j) return -oo; return min(valD[j] - valD[i], valD[i] + (valD[m - 1] - valD[j]) + w) + valx[i] + valx[j]; } ll calR(int m, int l, int r) { ll res = 0; for (int i = 0; i < m; i++) { res = max(res, max(max(calD(m, 0, i), calD(m, i, m - 1)), valx[i])); } int j = 0; for (int i = m; i < 3 * m; i++, j++) { if (j >= m) j -= m; valx[i] = valx[j]; valD[i] = valD[(i - j) - 1] + w + valD[j]; } j = 0; for (int i = m; i < 2 * m; i++) { j = max(j, i - m + 1); while ((valD[i] - valD[j]) > (valD[j + m] - valD[i])) j++; res = max(res, cal1(l + (i - m), (i - j), l, r)); res = max(res, cal2(l + (i - m), (j + m) - (i + 1), l, r)); } return res; } ll calx(int l, int r) { if (l == r) return max(A1[n - 1], A2[0]); ll res = max(A1[l], A2[r]); for (int i = l; i <= r; i++) { valx[i - l] = A[i]; valD[i - l] = D[i] - D[l]; } int m = (r - l + 1); for (int i = 0; i < l; i++) valx[0] = max(valx[0], A[i] + (D[l] - D[i])); for (int i = r + 1; i < n; i++) valx[m - 1] = max(valx[m - 1], A[i] + (D[i] - D[r])); res = max(res, calR(m, l, r)); return res; } ll find_shortcut(int nx, vector<int> lx, vector<int> dx, int cx) { n = nx; w = cx; D[0] = 0; for (int i = 0; i < n; i++) A[i] = dx[i]; for (int i = 1; i < n; i++) D[i] = D[i - 1] + lx[i - 1]; for (int i = n - 1; i >= 0; i--) { M1[i][0] = A[i] + D[i]; M2[i][0] = A[i] - D[i]; for (int j = 1; j < maxlg; j++) { if (i + (1 << j) - 1 >= n) break; M1[i][j] = max(M1[i][j - 1], M1[i + (1 << (j - 1))][j - 1]); M2[i][j] = max(M2[i][j - 1], M2[i + (1 << (j - 1))][j - 1]); } } ll mx = -oo; for (int i = 0; i < n; i++) { A1[i] = max(A[i], (A[i] + D[i]) + mx); if (i - 1 >= 0) A1[i] = max(A1[i], A1[i - 1]); mx = max(mx, A[i] - D[i]); } mx = -oo; for (int i = n - 1; i >= 0; i--) { A2[i] = max(A[i], (A[i] - D[i]) + mx); if (i + 1 < n) A2[i] = max(A2[i], A2[i + 1]); mx = max(mx, A[i] + D[i]); } ll ans = oo; for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { ans = min(ans, calx(i, j)); } } return ans; }

Compilation message (stderr)

shortcut.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
shortcut_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...