Submission #434159

#TimeUsernameProblemLanguageResultExecution timeMemory
434159rqiChessboard (IZhO18_chessboard)C++14
100 / 100
614 ms4256 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pi; typedef vector<int> vi; typedef long long ll; typedef pair<ll, ll> pl; #define pb push_back #define mp make_pair #define f first #define s second #define sz(x) (int)(x).size() void ckmin(ll& a, ll b){ a = min(a, b); } void ADD(pl& a, pl b){ a.f+=b.f; a.s+=b.s; } void print(pi a){ cout << a.f << " " << a.s << "\n"; cout.flush(); } void print(pl a){ cout << "pl: " << a.f << " " << a.s << "\n"; cout.flush(); } const ll INF = 1e18; const int mx = 100005; int N, K; int X1[mx]; int Y1[mx]; int X2[mx]; int Y2[mx]; pl shouldBe(int X, int Y, int SZ, bool white_corn){ assert(X % SZ == 0 && Y % SZ == 0); ll squares = ll(X/SZ)*ll(Y/SZ); ll white_squares = (squares+1)/2; if(!white_corn){ white_squares = squares-white_squares; } ll should_be_white = white_squares*ll(SZ)*ll(SZ); // cout << "squares: " << squares << "\n"; // cout << "should_be_white: " << should_be_white << "\n"; return mp(should_be_white, ll(X)*ll(Y)-should_be_white); } int SZ; bool shouldBeWhite(const pi& a){ return (a.f/SZ+a.s/SZ + 1) % 2; } pl doSingle(pi corner11, pi corner22){ ll area = ll(corner22.s+1-corner11.s)*ll(corner22.f+1-corner11.f); if(shouldBeWhite(corner11)){ return mp(area, 0); } return mp(0, area); } pl doEdge(pi corner11, pi corner22){ // cout << corner11.f << " " << corner11.s << " " << corner22.f << " " << corner22.s << "\n"; // cout.flush(); if(corner11.s/SZ == corner22.s/SZ && corner11.f % SZ == 0 && (corner22.f+1) % SZ == 0){ swap(corner11.f, corner11.s); swap(corner22.f, corner22.s); } assert((corner22.s+1) % SZ == 0); assert(corner11.f/SZ == corner22.f/SZ); int rect_num = (corner22.s+1-corner11.s)/SZ; ll rect_area = ll(corner22.f-corner11.f+1)*SZ; int white_num = (rect_num+1)/2; int black_num = rect_num-white_num; if(!shouldBeWhite(corner11)){ swap(white_num, black_num); } return mp(rect_area*white_num, rect_area*black_num); } pl doBig(pi corner11, pi corner22){ assert(corner11.f % SZ == 0 && corner11.s % SZ == 0); assert((corner22.f+1) % SZ == 0 && (corner22.s+1) % SZ == 0); ll rect_num = ll(corner22.f+1-corner11.f)/SZ*ll(corner22.s+1-corner11.s)/SZ; ll white_num = (rect_num+1)/2; ll black_num = rect_num-white_num; if(!shouldBeWhite(corner11)){ swap(white_num, black_num); } ll square_area = ll(SZ)*ll(SZ); return mp(square_area*white_num, square_area*black_num); } ll getAns(){ //bottom left should be white, count # of flips // cout << "SZ = " << SZ << "\n"; // cout.flush(); ll flip_to_white = 0; ll flip_to_black = 0; ll area_sum = 0; for(int i = 1; i <= K; i++){ pi corner11 = mp(X1[i], Y1[i]); pi corner22 = mp(X2[i], Y2[i]); area_sum+=ll(corner22.s-corner11.s+1)*ll(corner22.f-corner11.f+1); pl res = mp(0, 0); if(corner11.f/SZ < corner22.f/SZ && corner11.s/SZ < corner22.s/SZ){ pi CORNER11 = mp(corner11.f/SZ*SZ+SZ-1, corner11.s/SZ*SZ+SZ-1); pi CORNER22 = mp(corner22.f/SZ*SZ, corner22.s/SZ*SZ); // print(corner11); // print(CORNER11); // print(CORNER22); // print(corner22); ADD(res, doSingle(corner11, CORNER11)); ADD(res, doSingle(CORNER22, corner22)); ADD(res, doSingle(mp(corner11.f, CORNER22.s), mp(CORNER11.f, corner22.s))); ADD(res, doSingle(mp(CORNER22.f, corner11.s), mp(corner22.f, CORNER11.s))); // print(res); ADD(res, doEdge(mp(corner11.f, CORNER11.s+1), mp(CORNER11.f, CORNER22.s-1))); ADD(res, doEdge(mp(CORNER11.f+1, corner11.s), mp(CORNER22.f-1, CORNER11.s))); ADD(res, doEdge(mp(CORNER22.f, CORNER11.s+1), mp(corner22.f, CORNER22.s-1))); ADD(res, doEdge(mp(CORNER11.f+1, CORNER22.s), mp(CORNER22.f-1, corner22.s))); // print(res); ADD(res, doBig(mp(CORNER11.f+1, CORNER11.s+1), mp(CORNER22.f-1, CORNER22.s-1))); // print(res); } else if(corner11.f/SZ == corner22.f/SZ && corner11.s/SZ == corner22.s/SZ){ ADD(res, doSingle(corner11, corner22)); } else{ pi CORNER11 = mp(-1, -1); pi CORNER22 = mp(-1, -1); if(corner11.f/SZ == corner22.f/SZ){ CORNER11 = mp(corner22.f, corner11.s/SZ*SZ+SZ-1); CORNER22 = mp(corner11.f, corner22.s/SZ*SZ); } else{ CORNER11 = mp(corner11.f/SZ*SZ+SZ-1, corner22.s); CORNER22 = mp(corner22.f/SZ*SZ, corner11.s); } ADD(res, doSingle(corner11, CORNER11)); // cout << "EDGE" << " " << res.f << " " << res.s << "\n"; ADD(res, doSingle(CORNER22, corner22)); // cout << "EDGE" << " " << res.f << " " << res.s << "\n"; // print(corner11); // print(CORNER11); // print(CORNER22); // print(corner22); if(corner11.f/SZ == corner22.f/SZ){ ADD(res, doEdge(mp(corner11.f, CORNER11.s+1), mp(corner22.f, CORNER22.s-1))); // cout << "CASE 1 " << "\n"; } else{ ADD(res, doEdge(mp(CORNER11.f+1, corner11.s), mp(CORNER22.f-1, corner22.s))); } // cout << "EDGE" << " " << res.f << " " << res.s << "\n"; } // cout << i << " (" << res.f << ", " << res.s << ") \n"; flip_to_white+=res.f; flip_to_black+=res.s; } // assert(area_sum == flip_to_white+flip_to_black); // cout << "flip_to_white, black: " << flip_to_white << ", " << flip_to_black << "\n"; ll should_be_black = shouldBe(N, N, SZ, 1).s; return flip_to_white+(should_be_black-flip_to_black); } int main(){ cin.tie(0)->sync_with_stdio(0); cin >> N >> K; for(int i = 1; i <= K; i++){ cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i]; X1[i]--; Y1[i]--; X2[i]--; Y2[i]--; } ll ans = INF; for(int i = 1; i < N; i++){ if(N % i == 0){ SZ = i; ll res = getAns(); // cout << "i, res: " << i << ", " << res << "\n"; ckmin(ans, res); ckmin(ans, ll(N)*ll(N)-res); } } cout << ans << "\n"; }
#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...