Submission #1360122

#TimeUsernameProblemLanguageResultExecution timeMemory
1360122tickcrossyMosaic (IOI24_mosaic)C++20
20 / 100
72 ms22188 KiB
#include <vector>

using namespace std;

vector<long long> mosaic(vector<int> X, vector<int> Y, vector<int> T, vector<int> B, vector<int> L, vector<int> R) {
    int N = X.size();
    int Q = T.size();
    
    // 第 1 行与第 1 列
    vector<int> M1(N, 0);
    vector<int> Mcol1(N, 0);
    
    if (N > 1) {
        M1[0] = Y[1];
        for (int j = 1; j < N; ++j) {
            M1[j] = 1 - (X[j] | M1[j-1]);
        }
        
        Mcol1[0] = X[1];
        for (int i = 1; i < N; ++i) {
            Mcol1[i] = 1 - (Mcol1[i-1] | Y[i]);
        }
    }
    
    // P_0 是对角线值 V 的前缀和,P_1 是 k * V 的前缀和
    // 平移 N 使得索引均为非负数
    vector<long long> P_0(2 * N + 2, 0);
    vector<long long> P_1(2 * N + 2, 0);
    
    if (N > 1) {
        for (int k = 2 - N; k <= N - 2; ++k) {
            long long v = 0;
            if (k >= 0) {
                v = M1[k + 1];
            } else {
                v = Mcol1[1 - k];
            }
            int idx = k + N; 
            P_0[idx] = P_0[idx - 1] + v;
            P_1[idx] = P_1[idx - 1] + (long long)k * v;
        }
    }
    
    vector<long long> P_X(N, 0);
    vector<long long> P_Y(N, 0);
    P_X[0] = X[0];
    for (int i = 1; i < N; ++i) P_X[i] = P_X[i-1] + X[i];
    P_Y[0] = Y[0];
    for (int i = 1; i < N; ++i) P_Y[i] = P_Y[i-1] + Y[i];
    
    // 助手函数:获取 V 范围内的前缀和
    auto sum_V = [&](long long k1, long long k2) -> long long {
        if (k1 > k2) return 0;
        int idx2 = k2 + N;
        int idx1 = k1 - 1 + N;
        return P_0[idx2] - P_0[idx1];
    };

    auto sum_kV = [&](long long k1, long long k2) -> long long {
        if (k1 > k2) return 0;
        int idx2 = k2 + N;
        int idx1 = k1 - 1 + N;
        return P_1[idx2] - P_1[idx1];
    };

    // 获取内部矩形 [1, i] x [1, j] 的 1 的总数
    auto get_S = [&](long long i, long long j) -> long long {
        if (i <= 0 || j <= 0) return 0;
        long long ans = 0;
        if (i <= j) {
            if (1 - i <= -1) {
                ans += i * sum_V(1 - i, -1) + sum_kV(1 - i, -1);
            }
            if (0 <= j - i) {
                ans += i * sum_V(0, j - i);
            }
            if (j - i + 1 <= j - 1) {
                ans += j * sum_V(j - i + 1, j - 1) - sum_kV(j - i + 1, j - 1);
            }
        } else {
            if (1 - i <= j - i) {
                ans += i * sum_V(1 - i, j - i) + sum_kV(1 - i, j - i);
            }
            if (j - i + 1 <= -1) {
                ans += j * sum_V(j - i + 1, -1);
            }
            if (0 <= j - 1) {
                ans += j * sum_V(0, j - 1) - sum_kV(0, j - 1);
            }
        }
        return ans;
    };
    
    // 整体从左上角 [0, 0] 到 [i, j] 的前缀和
    auto get_F = [&](long long i, long long j) -> long long {
        if (i < 0 || j < 0) return 0;
        return get_S(i, j) + P_X[j] + P_Y[i] - X[0];
    };
    
    // 处理所有的问题反馈给 Salma 的好奇朋友 Yasmin
    vector<long long> C(Q);
    for (int q = 0; q < Q; ++q) {
        long long t = T[q], b = B[q], l = L[q], r = R[q];
        C[q] = get_F(b, r) - get_F(t - 1, r) - get_F(b, l - 1) + get_F(t - 1, l - 1);
    }
    
    return C;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...