제출 #1211725

#제출 시각아이디문제언어결과실행 시간메모리
1211725Ahmed_Kaaniche유괴 2 (JOI17_abduction2)C++20
27 / 100
268 ms589824 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define endl '\n' #define fi first #define se second #define pb push_back ll n, m, q; vector<ll> arr1; vector<ll> arr2; vector<pair<ll, ll>> qry; vector<vector<ll>> dp; ll solve(ll x, ll y, ll dir) { if (dir == 1) {//right ll tmp = 1; for (ll i = x + 1; i < m; ++i) { if (arr2[i] > arr1[y]) break; if (i == m - 1) return tmp; tmp++; } if (dp[x + tmp][y] == -1) { if (y < n - 1) dp[x + tmp][y] = max(dp[x + tmp][y], solve(x + tmp, y, 3)); if (y > 0) dp[x + tmp][y] = max(dp[x + tmp][y], solve(x + tmp, y, 4)); } return dp[x + tmp][y] + tmp; } else if (dir == 2) {//left ll tmp = 1; for (ll i = x - 1; i >= 0; --i) { if (arr2[i] > arr1[y]) break; if (i == 0) return tmp; tmp++; } if (dp[x - tmp][y] == -1) { if (y < n - 1) dp[x - tmp][y] = max(dp[x - tmp][y], solve(x - tmp, y, 3)); if (y > 0) dp[x - tmp][y] = max(dp[x - tmp][y], solve(x - tmp, y, 4)); } return dp[x - tmp][y] + tmp; } else if (dir == 3) {//down ll tmp = 1; for (ll i = y + 1; i < n; ++i) { if (arr1[i] > arr2[x]) break; if (i == n - 1) return tmp; tmp++; } if (dp[x][y + tmp] == -1) { if (x < m - 1) dp[x][y + tmp] = max(dp[x][y + tmp], solve(x, y + tmp, 1)); if (x > 0) dp[x][y + tmp] = max(dp[x][y + tmp], solve(x, y + tmp, 2)); } return dp[x][y + tmp] + tmp; } else {//up ll tmp = 1; for (ll i = y - 1; i >= 0; --i) { if (arr1[i] > arr2[x]) break; if (i == 0) return tmp; tmp++; } if (dp[x][y - tmp] == -1) { if (x < m - 1) dp[x][y - tmp] = max(dp[x][y - tmp], solve(x, y - tmp, 1)); if (x > 0) dp[x][y - tmp] = max(dp[x][y - tmp], solve(x, y - tmp, 2)); } return dp[x][y - tmp] + tmp; } } signed main() { //the boost ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); //main code cin >> n >> m >> q; arr1.resize(n); arr2.resize(m); qry.resize(q); dp.assign(m, vector<ll>(n, -1)); for (ll i = 0; i < n; ++i) { cin >> arr1[i]; } for (ll i = 0; i < m; ++i) { cin >> arr2[i]; } for (ll i = 0; i < q; ++i) { cin >> qry[i].fi >> qry[i].se; } for (ll i = 0; i < q; ++i) { ll a = -1, b = -1, c = -1, d = -1; ll x = qry[i].se - 1, y = qry[i].fi - 1; if (x < m - 1) a = solve(x, y, 1);//right if (x > 0) b = solve(x, y, 2);//left if (y < n - 1) c = solve(x, y, 3);//down if (y > 0) d = solve(x, y, 4);//up if (arr1[y] > arr2[x]) dp[x][y] = max(a, b); else dp[x][y] = max(c, d); cout << max(max(a, b), max(c, d)) << endl; } return 0; }
#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...