Submission #1321713

#TimeUsernameProblemLanguageResultExecution timeMemory
1321713patgraSightseeing in Kyoto (JOI22_kyoto)C++20
0 / 100
2105 ms269824 KiB
#include <bits/stdc++.h> #define rep(a,b,c) for(auto a = (b); a != (c); a++) #define repD(a,b,c) for(auto a = (b); a != (c); a--) #define repIn(a, b) for(auto& a : (b)) #define repIn2(a, b, c) for(auto& [a, b] : (c)) constexpr bool dbg = 1; #define DEBUG if constexpr(dbg) #define DC DEBUG std::cerr #define eol std::endl #define int long long #define ld long double #define pb push_back using namespace std; constexpr int inf = 2e18; int n, m; vector<int> a, b; map<array<int, 4>, int> mp; int solve(int la, int ra, int lb, int rb); int _solve(int la, int ra, int lb, int rb) { if(la == ra) return a[la] * (rb - lb); if(lb == rb) return b[lb] * (ra - la); if(la + 1 == ra) { int ans = inf; rep(i, lb, rb + 1) ans = min(ans, a[la] * (i - lb) + b[i] + a[ra] * (rb - i)); return ans; } if(lb + 1 == rb) { int ans = inf; rep(i, la, ra + 1) ans = min(ans, b[lb] * (i - la) + a[i] + b[rb] * (ra - i)); return ans; } pair<int, int> mn = {inf, -1}; rep(i, la + 1, ra) mn = min(mn, {a[i], i}); int ma = mn.second; mn = {inf, -1}; rep(i, lb + 1, rb) mn = min(mn, {b[i], i}); int mb = mn.second; auto ans = min({a[la] * (rb - lb) + b[rb] * (ra - la), b[lb] * (ra - la) + a[ra] * (rb - lb), solve(la, ma, lb, mb) + solve(ma, ra, mb, rb)}); ans = min(ans, a[la] * (mb - lb) + solve(la, ra, mb, rb)); ans = min(ans, b[lb] * (ma - la) + solve(ma, ra, lb, rb)); ans = min(ans, a[ra] * (rb - mb) + solve(la, ra, lb, mb)); ans = min(ans, b[rb] * (ra - ma) + solve(la, ma, lb, rb)); return ans; } int solve(int la, int ra, int lb, int rb) { array<int, 4> ar = {la, ra, lb, rb}; if(!mp.count(ar)) mp[ar] = _solve(la, ra, lb, rb); return mp[ar]; } void bru() { vector<vector<array<int, 3>>> dp(n, vector<array<int, 3>>(m, {inf, -1, -1})); dp[0][0] = {0, 0, 0}; rep(i, 0, n) rep(j, 0, m) { auto x = dp[i][j][0]; if(i < n - 1) dp[i + 1][j] = min(dp[i + 1][j], {x + b[j], i, j}); if(j < m - 1) dp[i][j + 1] = min(dp[i][j + 1], {x + a[i], i, j}); } stack<array<int, 3>> s; int x = n - 1, y = m - 1; while(x || y) { auto [d, nx, ny] = dp[x][y]; s.push({d - dp[nx][ny][0], x, y}); x = nx, y = ny; } cout << dp[n - 1][m - 1][0] << '\n'; DC << "0, 0\n"; while(s.size()) { auto [c, x, y] = s.top(); s.pop(); DC << " -> " << x << ", " << y << " \tcosting " << c << '\n'; } } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> m; a.resize(n), b.resize(m); repIn(i, a) cin >> i; repIn(i, b) cin >> i; cout << solve(0, n - 1, 0, m - 1) << '\n'; //bru(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...