萌新求助P8572
查看原帖
萌新求助P8572
530349
天空即为极限楼主2022/10/5 14:56
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace work1 {
    int a[500005], n, k, q, s[500005];
    int U(int i, int j) {
        return (i - 1) * n + j;
    }
    int main(int N, int K, int Q) {
        n = N, k = K, q = Q;
        for(int i = 1; i <= k; i++)
            for(int j = 1; j <= n; j++) {
                scanf("%lld", &a[U(i, j)]);
                if(j != 1) s[U(i, j)] = s[U(i, j - 1)] + a[U(i, j)];
                else s[U(i, j)] = a[U(i, j)];
            }
        while(q --) {
            int l, r; scanf("%lld%lld", &l, &r);
            int ans = -1;
            for(int i = 1; i <= k; i++) {
                int L = s[U(i, l - 1)], R = s[U(i, r)];
                if(l - 1 == 0) L = 0; if(r == 0) R = 0;
                ans = max(ans, R - L);
            }
            printf("%lld\n", ans);
        }
    }
}

namespace work2{
    int a[500005], n, k, q, s[500005], Ans[1005][1005];
    int U(int i, int j) {
        return (i - 1) * n + j;
    }
    int main(int N, int K, int Q) {
        n = N, k = K, q = Q;
        for(int i = 1; i <= k; i++)
            for(int j = 1; j <= n; j++) {
                scanf("%lld", &a[U(i, j)]);
                if(j != 1) s[U(i, j)] = s[U(i, j - 1)] + a[U(i, j)];
                else s[U(i, j)] = a[U(i, j)];
            }
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= i; j++) {
                int maxi = -1e9;
                for(int t = 1; t <= k; t++) {
                    int L = s[U(t, j - 1)], R = s[U(t, i)];
                    if(j - 1 == 0) L = 0;
                    maxi = max(maxi, R - L);
                }
                Ans[j][i] = maxi;
            }
        }
        while(q--) {
            int l, r; scanf("%lld%lld", &l, &r);
            printf("%lld\n", Ans[l][r]);
        }
    }
}
signed main(){
    int n, k, q; scanf("%lld%lld%lld", &n, &k, &q);
    if(n > k)   work1::main(n, k, q);
    else work2::main(n, k, q);
}
2022/10/5 14:56
加载中...