제출 #90899

#제출 시각아이디문제언어결과실행 시간메모리
90899toloraiaChessboard (IZhO18_chessboard)C++17
100 / 100
1178 ms34588 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const ll N = 1e5 + 5;

ll n, k;
ll x[N], y[N], X[N], Y[N];
ll a[2][2];
ll S1, S2;
ll ans;

int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for (ll i = 1; i <= k; i++){
        cin>>x[i]>>y[i]>>X[i]>>Y[i];
        x[i]--;
        y[i]--;
        X[i]--;
        Y[i]--;
        S1 += (X[i] - x[i] + 1) * (Y[i] - y[i] + 1);
    }
    S2 = n * n - S1;
    ans = n * n;
    for (ll I = 1; I < n; I++)
        if (n % I == 0){
            ll s1 = ((n / I) * (n / I) + 1) / 2 * I * I, s2 = (n / I) * (n / I) / 2 * I * I;
            ll m1 = 0, m2 = 0;
            for (ll i = 1; i <= k; i++){
                for (ll j = 0; j < 2; j++)
                    for (ll l = 0; l < 2; l++)
                        a[j][l] = 0;
                ll p, q, t;
                p = (x[i] + I - 1) / I * I;
                if (X[i] < p)
                    a[0][(x[i] / I) % 2] += X[i] - x[i] + 1;
                else {
                    q = X[i] / I * I;
                    t = (q - p) / I;
                    a[0][(x[i] / I) % 2] += p - x[i];
                    a[0][(X[i] / I) % 2] += X[i] - q + 1;
                    a[0][(p / I) % 2] += (t + 1) / 2 * I;
                    a[0][(p / I + 1) % 2] += t / 2 * I;
                }
                p = (y[i] + I - 1) / I * I;
                if (Y[i] < p)
                    a[1][(y[i] / I) % 2] += Y[i] - y[i] + 1;
                else {
                    q = Y[i] / I * I;
                    t = (q - p) / I;
                    a[1][(y[i] / I) % 2] += p - y[i];
                    a[1][(Y[i] / I) % 2] += Y[i] - q + 1;
                    a[1][(p / I) % 2] += (t + 1) / 2 * I;
                    a[1][(p / I + 1) % 2] += t / 2 * I;
                }
                m1 += a[0][0] * a[1][0] + a[0][1] * a[1][1];
                m2 += a[0][0] * a[1][1] + a[0][1] * a[1][0];
            }
            ll pas = 0;
            pas = n * n - m1 - (s2 - m2);
            ans = min (ans, pas);
            pas = n * n - m2 - (s1 - m1);
            ans = min (ans, pas);
        }
    cout<<ans<<endl;
    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...