Submission #1128672

#TimeUsernameProblemLanguageResultExecution timeMemory
1128672_callmelucianChessboard (IZhO18_chessboard)C++17
100 / 100
882 ms3604 KiB
#include <bits/stdc++.h> using namespace std; #define int long long typedef long long ll; typedef long double ld; typedef pair<ll,ll> pl; typedef pair<int,int> pii; typedef tuple<int,int,int> tpl; #define all(a) a.begin(), a.end() #define filter(a) a.erase(unique(all(a)), a.end()) const int mn = 5e5 + 5; ll xL[mn], yL[mn], xR[mn], yR[mn], cnt[2][2]; ll squared (ll a) { return a * a; } void compute (vector<ll> &a, int L, int R, int u) { int dL = L / u, dR = R / u, mid = dR - dL - 1; if (dL == dR) return a[dL & 1] += R % u - L % u + 1, void(); a[dL & 1] += u - L % u, a[dR & 1] += 1 + R % u; if (mid & 1) { a[dL & 1 ^ 1] += ((mid >> 1) + (mid & 1)) * u; a[dL & 1] += (mid >> 1) * u; } else a[0] += (mid >> 1) * u, a[1] += (mid >> 1) * u; } signed main() { ios::sync_with_stdio(0); cin.tie(0); int n, k; cin >> n >> k; vector<int> wish; for (int i = 1; i * i <= n; i++) { if (n % i) continue; wish.push_back(i); if (i != n / i && n / i < n) wish.push_back(n / i); } for (int i = 0; i < k; i++) { cin >> xL[i] >> yL[i] >> xR[i] >> yR[i]; xL[i]--, yL[i]--, xR[i]--, yR[i]--; } ll ans = LLONG_MAX; for (int u : wish) { for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) cnt[i][j] = 0; ll sq = n / u; cnt[0][0] = (squared((sq >> 1) + (sq & 1)) + squared(sq >> 1)) * u * u; cnt[0][1] = (2LL * (sq >> 1) * ((sq >> 1) + (sq & 1))) * u * u; for (int i = 0; i < k; i++) { vector<ll> row(2), col(2); compute(row, xL[i], xR[i], u), compute(col, yL[i], yR[i], u); // if (u == 1) // cout << row[0] << " " << row[1] << " "<< col[0] << " " << col[1] << "\n"; ll type_0 = row[0] * col[0] + row[1] * col[1]; ll type_1 = row[0] * col[1] + row[1] * col[0]; cnt[0][0] -= type_0, cnt[1][0] += type_0; cnt[0][1] -= type_1, cnt[1][1] += type_1; } // cout << "size-square " << u << " " << cnt[0][0] << " " << cnt[0][1] << " " << cnt[1][0] << " " << cnt[1][1] << "\n"; ans = min(ans, cnt[0][0] + cnt[1][1]); ans = min(ans, cnt[1][0] + cnt[0][1]); } 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...