제출 #1225582

#제출 시각아이디문제언어결과실행 시간메모리
1225582PagodePaiva모자이크 (IOI24_mosaic)C++20
53 / 100
87 ms27580 KiB
#include "mosaic.h"
#include<bits/stdc++.h>

using namespace std;

const int N = 200010;
int linha[3][N], coluna[N][3];
long long pref[N];
long long pref_linha[3][N], pref_coluna[N][3];

std::vector<long long> mosaic(std::vector<int> x, std::vector<int> y,
                              std::vector<int> T, std::vector<int> B,
                              std::vector<int> L, std::vector<int> R) {
    int n = x.size();
    vector <long long> ans;
    for(int i = 0;i < n;i++){
        linha[0][i] = x[i];
        coluna[i][0] = y[i];
    }
    linha[1][0] = coluna[1][0];
    linha[2][0] = coluna[2][0];
    coluna[0][1] = linha[0][1];
    coluna[0][2] = linha[0][2];
    for(int i = 1;i < 3;i++){
        for(int j = 1;j < n;j++){
            if(linha[i][j-1] == 0 and linha[i-1][j] == 0)
                linha[i][j] = 1;
            else
                linha[i][j] = 0;
            if(coluna[j-1][i] == 0 and coluna[j][i-1] == 0)
                coluna[j][i] = 1;
            else
                coluna[j][i] = 0;
        }
    }
    for(int i = 0;i < 3;i++){
        for(int j = 0;j < n;j++){
            pref_linha[i][j] = (j-1 < 0 ? 0 : pref_linha[i][j-1]) + linha[i][j];
            //cout << pref_linha[i][j] << ' ';
            pref_coluna[j][i] = (j-1 < 0 ? 0 : pref_coluna[j-1][i]) + coluna[j][i];
        }
        //cout << '\n';
    }
    int C = n-3;
    for(int i = n-1;i >= 2;i--){
        pref[C-(i-2)] = (C - (i-2) -1 <  0 ? 0 : pref[C-(i-2)-1]) + coluna[i][2];    
    }
    for(int i = 3;i < n;i++){
        pref[C + (i-2)] = (C + (i-2) - 1 <  0 ? 0 : pref[C + (i-2) -1]) + linha[2][i];
    }
    for(int i = 0;i < T.size();i++){
        int l_linha = T[i], r_linha = B[i], l_coluna = L[i], r_coluna = R[i];
        long long answer = 0;
        while(l_linha < min(r_linha+1, 3)){
            answer += pref_linha[l_linha][r_coluna] - (l_coluna == 0 ? 0 : pref_linha[l_linha][l_coluna-1]);
            l_linha++;
        }
        if(l_linha > r_linha){
            ans.push_back(answer);
            continue;
        }
        while(l_coluna < min(r_coluna+1, 3)){
            answer += pref_coluna[r_linha][l_coluna] - (l_linha == 0 ? 0 : pref_coluna[l_linha-1][l_coluna]);
            l_coluna++;
        }
        if(l_coluna > r_coluna){
            ans.push_back(answer);
            continue;
        }
        // l_linha > 2, l_coluna > 2
        answer += pref[r_coluna-l_linha+C] - (l_coluna - l_linha + C - 1 < 0 ? 0 : pref[l_coluna - l_linha + C - 1]);
        ans.push_back(answer);
    }
    return ans;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...