제출 #1211749

#제출 시각아이디문제언어결과실행 시간메모리
1211749Ahmed_Kaaniche유괴 2 (JOI17_abduction2)C++20
27 / 100
259 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

int n, m, q;
vector<int> arr1;
vector<int> arr2;
vector<pair<int, int>> qry;
vector<vector<int>> dp;

int solve(int x, int y, int dir) {
    if (dir == 1) {//right
        int tmp = 1;
        
        for (int 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
        int tmp = 1;
        
        for (int 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
        int tmp = 1;
        
        for (int 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
        int tmp = 1;
        
        for (int 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<int>(n, -1));
    
    for (int i = 0; i < n; ++i) {
        cin >> arr1[i];
    }
    for (int i = 0; i < m; ++i) {
        cin >> arr2[i];
    }
    for (int i = 0; i < q; ++i) {
        cin >> qry[i].fi >> qry[i].se;
    }
    
    
    for (int i = 0; i < q; ++i) {
        int a = -1, b = -1, c = -1, d = -1;
        int 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...