Submission #48157278


Source Code Expand

#include <bits/stdc++.h>
#include <atcoder/modint>

namespace {
using ModInt [[maybe_unused]] = atcoder::modint998244353;
using Num [[maybe_unused]] = long long int;
using Vec [[maybe_unused]] = std::vector<Num>;
using Set [[maybe_unused]] = std::set<Num>;
using Mset [[maybe_unused]] = std::multiset<Num>;
using Edges [[maybe_unused]] = std::vector<std::vector<Num>>;

template<typename T>
using Q [[maybe_unused]] = std::queue<T>;

template<typename T>
using PQ [[maybe_unused]] = std::priority_queue<T, std::vector<T>, std::greater<T>>;
}

constexpr Num Len = 1024;
Num n, q;
Num grid[Len][Len];
Num cumsum[Len][Len];

Num count_sub(Num top, Num left, Num bottom, Num right) {
    return cumsum[bottom][right] - cumsum[top][right] - cumsum[bottom][left] + cumsum[top][left];
}

Num count_full(Num bottom, Num right) {
    const auto n_full = count_sub(0, 0, n, n);
    const auto height = bottom / n;
    const auto width = right / n;
    const auto b = bottom % n;
    const auto r = right % n;

    Num total = height * width * n_full;
    total += count_sub(0, 0, n, r) * height;
    total += count_sub(0, 0, b, n) * width;
    total += count_sub(0, 0, b, r);
    return total;
}

void calc_cumsum() {
    for(Num y{1}; y<=n; ++y) {
        for(Num x{1}; x<=n; ++x) {
            cumsum[y][x] = grid[y-1][x-1];
        }
    }

    for(Num y{0}; y<=n; ++y) {
        for(Num x{1}; x<=n; ++x) {
            cumsum[y][x] += cumsum[y][x-1];
        }
    }

    for(Num x{0}; x<=n; ++x) {
        for(Num y{1}; y<=n; ++y) {
            cumsum[y][x] += cumsum[y-1][x];
        }
    }
}

void solve(std::istream& is, std::ostream& os) {
    is >> n >> q;

    for(Num y{0}; y<n; ++y) {
        std::string s;
        is >> s;
        for(Num x{0}; x<n; ++x) {
            const Num b = (s.at(x) == 'B') ? 1 : 0;
            grid[y][x] = b;
        }
    }

    calc_cumsum();

    while(q-- > 0) {
        Num a, b, c, d;
        is >> a >> b >> c >> d;
        ++c;
        ++d;

        Num total = count_full(c, d);
        total -= count_full(a, d);
        total -= count_full(c, b);
        total += count_full(a, b);
        os << total << "\n";
    }
}

int main(void) {
    solve(std::cin, std::cout);
    return 0;
}

Submission Info

Submission Time
Task D - Tile Pattern
User zettsut
Language C++ 20 (gcc 12.2)
Score 450
Code Size 2322 Byte
Status AC
Exec Time 443 ms
Memory 20036 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 450 / 450
Status
AC × 2
AC × 16
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_corner_00.txt, 01_corner_01.txt, 01_corner_02.txt, 02_random_00.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 03_max_00.txt, 03_max_01.txt, 04_n_small_00.txt, 04_n_small_01.txt, 04_n_small_02.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 3484 KiB
00_sample_01.txt AC 1 ms 3572 KiB
01_corner_00.txt AC 403 ms 4008 KiB
01_corner_01.txt AC 1 ms 3616 KiB
01_corner_02.txt AC 1 ms 3512 KiB
02_random_00.txt AC 357 ms 6416 KiB
02_random_01.txt AC 214 ms 6504 KiB
02_random_02.txt AC 207 ms 4632 KiB
02_random_03.txt AC 118 ms 4752 KiB
02_random_04.txt AC 153 ms 13632 KiB
02_random_05.txt AC 361 ms 12684 KiB
03_max_00.txt AC 443 ms 20036 KiB
03_max_01.txt AC 437 ms 20020 KiB
04_n_small_00.txt AC 283 ms 3576 KiB
04_n_small_01.txt AC 283 ms 3524 KiB
04_n_small_02.txt AC 282 ms 3548 KiB