Submission #844079

#TimeUsernameProblemLanguageResultExecution timeMemory
844079GrandTiger1729Chessboard (IZhO18_chessboard)C++17
47 / 100
169 ms2136 KiB
#include <bits/stdc++.h>
using namespace std;

struct Data
{
    int x1, y1, x2, y2;
    Data() = default;
    Data(int _x1, int _y1, int _x2, int _y2) : x1(_x1), y1(_y1), x2(_x2), y2(_y2) {}
};

const long long INF = 1e18;
int main()
{
    cin.tie(0)->sync_with_stdio(0);
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int M, n; cin >> M >> n;
    vector<Data> a(n);
    for (int i = 0; i < n; i++)
    {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        x1--, y1--;
        a[i] = Data(x1, y1, x2, y2);
    }
    auto color = [&](int t, int K, int x, int y) -> int // 1 for black -1 for white
    {
        return (t + x / K + y / K) % 2 == 1 ? 1 : -1;
    };
    auto solve = [&](int K) -> long long
    {
        long long ret1 = (1ll * (M / K) * (M / K) / 2 + M / K % 2) * K * K;
        for (auto &[x1, y1, x2, y2] : a)
        {
            int l1 = (x1 / K + (x1 % K > 0)) * K,
                r1 = (x2 / K) * K,
                l2 = (y1 / K + (y1 % K > 0)) * K,
                r2 = (y2 / K) * K;
            ret1 -= color(1, K, x1, y1) * (l1 - x1) * (l2 - y1);
            if (color(1, K, l1, y1) != color(1, K, r1, y1))
                ret1 -= color(1, K, l1, y1) * K * (l2 - y1);
            ret1 -= color(1, K, r1, y1) * (x2 - r1) * (l2 - y1);
            if (color(1, K, x1, l2) != color(1, K, x1, r2))
                ret1 -= color(1, K, x1, l2) * (l1 - x1) * K;
            if (color(1, K, l1, l2) != color(1, K, r1, l2) && color(1, K, l1, l2) != color(1, K, l1, r2))
                ret1 -= color(1, K, l1, l2) * K * K;
            if (color(1, K, r1, l2) != color(1, K, r1, r2))
                ret1 -= color(1, K, r1, l2) * (x2 - r1) * K;
            ret1 -= color(1, K, x1, r2) * (l1 - x1) * (y2 - r2);
            if (color(1, K, l1, r2) != color(1, K, r1, r2))
                ret1 -= color(1, K, l1, r2) * K * (y2 - r2);
            ret1 -= color(1, K, r1, r2) * (x2 - r1) * (y2 - r2);
        }
        long long ret2 = (1ll * (M / K) * (M / K) / 2) * K * K;
        for (auto &[x1, y1, x2, y2] : a)
        {
            int l1 = (x1 / K + (x1 % K > 0)) * K,
                r1 = (x2 / K) * K,
                l2 = (y1 / K + (y1 % K > 0)) * K,
                r2 = (y2 / K) * K;
            ret2 -= color(2, K, x1, y1) * (l1 - x1) * (l2 - y1);
            if (color(2, K, l1, y1) != color(2, K, r1, y1))
                ret2 -= color(2, K, l1, y1) * K * (l2 - y1);
            ret2 -= color(2, K, r1, y1) * (x2 - r1) * (l2 - y1);
            if (color(2, K, x1, l2) != color(2, K, x1, r2))
                ret2 -= color(2, K, x1, l2) * (l1 - x1) * K;
            if (color(2, K, l1, l2) != color(2, K, r1, l2) && color(2, K, l1, l2) != color(2, K, l1, r2))
                ret2 -= color(2, K, l1, l2) * K * K;
            if (color(2, K, r1, l2) != color(2, K, r1, r2))
                ret2 -= color(2, K, r1, l2) * (x2 - r1) * K;
            ret2 -= color(2, K, x1, r2) * (l1 - x1) * (y2 - r2);
            if (color(2, K, l1, r2) != color(2, K, r1, r2))
                ret2 -= color(2, K, l1, r2) * K * (y2 - r2);
            ret2 -= color(2, K, r1, r2) * (x2 - r1) * (y2 - r2);
        }
        return min(ret1, ret2);
    };
    long long ans = INF;
    for (int t = 1; t < M; t++)
        if (M % t == 0)
            ans = min(ans, solve(t));
    cout << ans << '\n';
    return 0;
}
#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...