답안 #551900

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
551900 2022-04-21T20:55:19 Z Lobo 유괴 2 (JOI17_abduction2) C++17
13 / 100
8 ms 12056 KB
#include<bits/stdc++.h>
using namespace std;

const long long inf = (long long) 1e18 + 10;
const int inf1 = (int) 1e9 + 10;
#define int long long
#define dbl long double
#define endl '\n'
#define sc second
#define fr first
#define mp make_pair
#define pb push_back
#define all(x) x.begin(), x.end()

const int maxn = 2e3+10;

int n, m, q, a[maxn], b[maxn], mark[maxn][maxn][5], dp[maxn][maxn][5];
pair<int,int> mxalf[maxn][25], mxarg[maxn][25], mxblf[maxn][25], mxbrg[maxn][25];

//ver com 32 tambem
int mxblr(int l, int r) {
    if(l > r) return -1;
    int lg = 31-__builtin_clz(r-l+1);
    auto ans = max(mxbrg[l][lg],mxblf[r][lg]);
    return ans.fr;
}
int mxalr(int l, int r) {
    if(l > r) return -1;
    int lg = 31-__builtin_clz(r-l+1);
    auto ans = max(mxarg[l][lg],mxalf[r][lg]);
    return ans.fr;
}
    
//0 -> x aumenta, 1 -> x diminui e dobra para vertical
//2 -> y aumenta, 3 -> y diminui
//x -> M e y-> N
int cnt = 0;
int sol(int y, int x, int dir) {
    if(mark[y][x][dir]) return dp[y][x][dir];
    mark[y][x][dir] = 1;


    if(dir == 0) {
        //vou para um (x1,y) que b[x1] > a[y] e x1 > x
        if(mxblr(x+1,m) < a[y]) {
            return dp[y][x][dir] = m-x;
        }

        int l = x+1;
        int r = m;
        int ans = -1;

        while(l <= r) {
            int mid = (l+r)/2;

            if(mxblr(x+1,mid) >= a[y]) {
                ans = mid;
                r = mid-1;
            }
            else {
                l = mid+1;
            }
        }

        return dp[y][x][dir] = ans-x+max(sol(y,ans,2),sol(y,ans,3));
    }
    else if(dir == 1) {
        //vou para um (x1,y) que b[x1] > a[y] e x1 < x
        if(mxblr(1,x-1) < a[y]) {
            return dp[y][x][dir] = x-1;
        }

        int l = 1;
        int r = x-1;
        int ans = -1;

        while(l <= r) {
            int mid = (l+r)/2;

            if(mxblr(mid,x-1) >= a[y]) {
                ans = mid;
                l = mid+1;
            }
            else {
                r = mid-1;
            }
        }

        return dp[y][x][dir] = x-ans+max(sol(y,ans,2),sol(y,ans,3));
    }
    else if(dir == 2) {
        //vou para um (x,y1) que a[y1] > b[x] e y1 > y
        if(mxalr(y+1,n) < b[x]) {
            return dp[y][x][dir] = n-y;
        }

        int l = y+1;
        int r = n;
        int ans = -1;

        while(l <= r) {
            int mid = (l+r)/2;

            if(mxalr(y+1,mid) >= b[x]) {
                ans = mid;
                r = mid-1;
            }
            else {
                l = mid+1;
            }
        }

        return dp[y][x][dir] = ans-y+max(sol(ans,x,0),sol(ans,x,1));
    }
    else {
        //vou para um (x,y1) que a[y1] > b[x] e y1 < y
        if(mxalr(1,y-1) < b[x]) {
            return dp[y][x][dir] = y-1;
        }

        int l = 1;
        int r = y-1;
        int ans = -1;

        while(l <= r) {
            int mid = (l+r)/2;

            if(mxalr(mid,y-1) >= b[x]) {
                ans = mid;
                l = mid+1;
            }
            else {
                r = mid-1;
            }
        }

        return y-ans+max(sol(ans,x,0),sol(ans,x,1));
    }
}



void solve() {
    cin >> n >> m >> q;

    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        mxalf[i][0] = mxarg[i][0] = mp(a[i],i);
    }
    for(int i = 1; i <= m; i++) {
        cin >> b[i];
        mxblf[i][0] = mxbrg[i][0] = mp(b[i],i);
    }

    for(int pt = 1; pt <= 20; pt++) {
        for(int i = 1; i <= n; i++) {
            mxalf[i][pt] = max(mxalf[i][pt-1],mxalf[max(1LL,i-(1<<(pt-1)))][pt-1]);
        }
    }

    for(int pt = 1; pt <= 20; pt++) {
        for(int i = 1; i <= n; i++) {
            mxarg[i][pt] = max(mxarg[i][pt-1],mxarg[min(n,i+(1<<(pt-1)))][pt-1]);
        }
    }

    for(int pt = 1; pt <= 20; pt++) {
        for(int i = 1; i <= m; i++) {
            mxblf[i][pt] = max(mxblf[i][pt-1],mxblf[max(1LL,i-(1<<(pt-1)))][pt-1]);
        }
    }

    for(int pt = 1; pt <= 20; pt++) {
        for(int i = 1; i <= m; i++) {
            mxbrg[i][pt] = max(mxbrg[i][pt-1],mxbrg[min(m,i+(1<<(pt-1)))][pt-1]);
        }
    }

    while(q--) {
        int y,x;
        cin >> y >> x;
        cout << max({sol(y,x,0),sol(y,x,1),sol(y,x,2),sol(y,x,3)}) << endl;
    }

}

int32_t main() {
    ios::sync_with_stdio(false); cin.tie(0);

    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    
    int tt = 1;
    // cin >> tt;
    while(tt--) {
        solve();
    }

}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 324 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 328 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 324 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 324 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 328 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 324 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 3 ms 3668 KB Output is correct
13 Incorrect 3 ms 3668 KB Output isn't correct
14 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 324 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 328 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 324 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 3 ms 3668 KB Output is correct
13 Incorrect 3 ms 3668 KB Output isn't correct
14 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 12056 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 324 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 328 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 324 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 3 ms 3668 KB Output is correct
13 Incorrect 3 ms 3668 KB Output isn't correct
14 Halted 0 ms 0 KB -