Submission #90351

#TimeUsernameProblemLanguageResultExecution timeMemory
90351HardNutChessboard (IZhO18_chessboard)C++17
70 / 100
1105 ms3708 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; const long long INF = 1e18 + 5; const int MAXN = 1e6; const int base = 317; typedef long long ll; const ll bs = 1e5 + 1; const ll mod = 998244353; #define int ll ll ans = INF, n, k, xx[N], yy[N], xx1[N], yy1[N]; int fndl(int cor, int x) { if (cor % x == 0) return cor; return (cor / x + 1) * x; } int fndr(int cor, int x) { if (cor % x == x - 1) return cor; return (cor / x) * x - 1; } void clc(int x, int y, int xx, int yy, ll &res1, ll &res2, int len) { if (yy < y || xx < x) return; int rs1 = 0, rs2 = 0; int n1 = xx - x + 1, n2 = yy - y + 1; rs1 = (n1 / len) * (n2 / len) / 2 * len * len; rs2 = n1 * n2 - rs1; swap(rs1, rs2); if ((x / len) % 2 != (y / len) % 2) { swap(rs1, rs2); } res1 += rs1; res2 += rs2; } void clcx(int x, int y, int xx, int yy, ll &res1, ll &res2, int len) { if (yy < y || xx < x) return; int nn = xx - x + 1; int ne = yy - y + 1; ll rs1 = (nn / len) / 2 * len * ne, rs2 = nn * ne - rs1; swap(rs1, rs2); if ((x / len) % 2 != (y / len) % 2) swap(rs1, rs2); res1 += rs1; res2 += rs2; } void clcy(int x, int y, int xx, int yy, ll &res1, ll &res2, int len) { if (yy < y || xx < x) return; int nn = yy - y + 1; int ne = xx - x + 1; ll rs1 = (nn / len) / 2 * len * ne, rs2 = nn * ne - rs1; swap(rs1, rs2); if ((x / len) % 2 != (y / len) % 2) swap(rs1, rs2); res1 += rs1; res2 += rs2; } void clc_cor(int x, int y, int xx, int yy, ll &res1, ll &res2, int len) { if (yy < y || xx < x) return; if ((x / len) % 2 == (y / len) % 2) { res1 += (xx - x + 1) * (yy - y + 1); } else { res2 += (xx - x + 1) * (yy - y + 1); } } ll calc(ll x) { ll res1 = 0, res2 = 0; for (int i = 1; i <= k; i++) { int x1 = fndl(xx[i], x), y1 = fndl(yy[i], x), x2 = fndr(xx1[i], x), y2 = fndr(yy1[i], x); if (x1 > x2 && y1 > y2) { bool us = 0; if (xx[i] <= x2 && yy[i] <= y2) clc_cor(xx[i], yy[i], x2, y2, res1, res2, x), us = 1; if (xx[i] <= x2 && y1 <= yy1[i]) clc_cor(xx[i], y1, x2, yy1[i], res1, res2, x), us = 1; if (x1 <= xx1[i] && yy1[i] <= y2) clc_cor(x1, yy[i], xx1[i], y2, res1, res2, x), us = 1; if (x1 <= xx1[i] && y1 <= yy1[i]) clc_cor(x1, y1, xx1[i], yy1[i], res1, res2, x), us = 1; if (!us) { clc_cor(xx[i], yy[i], xx1[i], yy1[i], res1, res2, x); } continue; } clc(x1, y1, x2, y2, res1, res2, x); clcx(x1, yy[i], x2, y1 - 1, res1, res2, x); clcx(x1, y2 + 1, x2, yy1[i], res1, res2, x); clcy(xx[i], y1, x1 - 1, y2, res1, res2, x); clcy(x2 + 1, y1, xx1[i], y2, res1, res2, x); if (x1 > xx[i] && y1 > yy[i]) clc_cor(xx[i], yy[i], x1 - 1, y1 - 1, res1, res2, x); if (x2 < xx1[i] && y1 > yy[i]) clc_cor(x2 + 1, yy[i], xx1[i], y1 - 1, res1, res2, x); if (xx[i] < x1 && yy1[i] > y2) clc_cor(xx[i], y2 + 1, x1 - 1, yy1[i], res1, res2, x); if (x2 < xx1[i] && yy1[i] > y2) clc_cor(x2 + 1, y2 + 1, xx1[i], yy1[i], res1, res2, x); } ll c1 = (n / x) * (n / x) / 2 * x * x; ll c2 = n * n - c1; return min(c1 - res2 + res1, c2 - res1 + res2); } main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k; for (int i = 1; i <= k; i++) { cin >> xx[i] >> yy[i] >> xx1[i] >> yy1[i]; xx[i]--; yy[i]--; xx1[i]--; yy1[i]--; } for (int i = 1; i <= sqrt(n); i++) { if (n % i == 0) { ans = min(ans, calc(i)); if (i != 1) ans = min(ans, calc(n / i)); } } cout << ans; return 0; } /* */

Compilation message (stderr)

chessboard.cpp:125:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main() {
      ^
#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...