252212026-02-18 14:29:49AblablablaSzámsorjáték (40 pont)cpp17Időlimit túllépés 14/401.1s1092 KiB
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;

int n, m, k;
vector<int> a, b;
vector<int> sufA, sufB;
vector<vector<int>> dp;

int megold(int egy, int ket){
    if(egy == n && ket == m){
        return 0;
    }
    int marad = sufA[egy] + sufB[ket];

    if(dp[egy][ket] != -1){
        return dp[egy][ket];
    }
    if(egy == n){
        return dp[egy][ket] = marad - megold(egy, ket + 1);
    }
    if(ket == m){
        return dp[egy][ket] = marad - megold(egy+1, ket);
    }


    int a = megold(egy + 1, ket + 1);
    int b = megold(egy + 1, ket);
    int c = megold(egy, ket + 1);

    return dp[egy][ket] = marad - min(a, min(b, c));
}

int main()
{
    cin >> n >> m >> k;

    a.assign(n, 0);
    b.assign(m, 0);

    for(int &x : a) cin >> x;
    for(int &x : b) cin >> x;

    sufA.assign(n+1, 0);
    sufB.assign(m+1, 0);
    for(int i = n - 1; i >= 0; i--){
        sufA[i] = sufA[i+1] + a[i];
    }
    for(int i = m - 1; i >= 0; i--){
        sufB[i] = sufB[i+1] + b[i];
    }


    vector<pii> kerdes(k);
    map<pii, int> valasz;
    for(int i = 0; i < k; i++){
        int a, b;
        cin >> a >> b;
        a--; b--;

        kerdes[i] = {a, b};
        valasz.insert({{a, b}, -1});
    }


    /*vector<int> egy, ket, har;
    har.assign(10004, 0);
    ket.assign(10004, 0);
    egy.assign(10004, 0);
    ket[n] = b.back();
    ket[n - 1] = a.back();*/
    int egy = 0, ket = 1, har = 2;

    vector<vector<int>> dp(3, vector<int>(n+2, 0));
    dp[ket][n] = b.back();
    dp[ket][n - 1] = a.back();


    for(int ossz = n+m - 2; ossz >= 0; ossz--){
        for(int x = max(0, ossz - m); x <= min(ossz, n); x++){
            int y = ossz - x;

            int marad = sufA[x] + sufB[y];


            if(x == n){
                dp[egy][x] = marad - dp[ket][x];
            } else if(y == m){
                dp[egy][x] = marad - dp[ket][x + 1];
            } else{
                dp[egy][x] = marad - min(dp[ket][x], min(dp[har][x + 1], dp[ket][x + 1]));
            }

            if(valasz.count({x, y})){
                valasz[{x,y}] = dp[egy][x];
            }
        }

        swap(ket, har);
        swap(egy, ket);
    }

    for(int i = 0; i < k; i++){
        cout << valasz[kerdes[i]] << "\n";
    }

    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base14/40
1Elfogadva0/01ms316 KiB
2Elfogadva0/0430ms820 KiB
3Elfogadva1/12ms316 KiB
4Elfogadva1/12ms500 KiB
5Elfogadva1/17ms508 KiB
6Elfogadva1/17ms316 KiB
7Elfogadva1/11ms316 KiB
8Elfogadva1/12ms604 KiB
9Elfogadva1/13ms316 KiB
10Elfogadva1/17ms480 KiB
11Elfogadva1/18ms564 KiB
12Elfogadva1/113ms712 KiB
13Elfogadva1/1128ms772 KiB
14Elfogadva1/198ms564 KiB
15Elfogadva1/175ms496 KiB
16Elfogadva1/175ms512 KiB
17Időlimit túllépés0/21.1s564 KiB
18Időlimit túllépés0/21.1s564 KiB
19Időlimit túllépés0/21.085s564 KiB
20Időlimit túllépés0/21.087s1076 KiB
21Időlimit túllépés0/21.082s1076 KiB
22Időlimit túllépés0/21.1s1092 KiB
23Időlimit túllépés0/31.08s1076 KiB
24Időlimit túllépés0/31.082s1076 KiB
25Időlimit túllépés0/41.078s1076 KiB
26Időlimit túllépés0/41.1s1092 KiB