제출 #334530

#제출 시각아이디문제언어결과실행 시간메모리
334530talant117408Chessboard (IZhO18_chessboard)C++17
100 / 100
1681 ms3692 KiB
/* Code written by Talant I.D. */ #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair <int, int> pii; typedef pair <ll, ll> pll; #define precision(n) fixed << setprecision(n) #define pb push_back #define ub upper_bound #define lb lower_bound #define mp make_pair #define eps (double)1e-9 #define PI 2*acos(0.0) #define endl "\n" #define sz(v) int((v).size()) #define all(v) v.begin(),v.end() #define rall(v) v.rbegin(),v.rend() #define do_not_disturb ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define OK cout << "OK" << endl; inline bool isvowel(char ch){ ch = tolower(ch); return (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u'); } inline bool isprime(int n){ if(n < 2 || (n%2 == 0 && n != 2)) return false; for(int i = 3; i*i <= n; i++) if(n%i == 0) return false; return true; } class Union{ private: vector <int> saizu, link; public: Union(int n){ saizu.assign(n, 1); link.resize(n); iota(all(link), 0); } int find(int n){ if(link[n] == n) return n; return link[n] = find(link[n]); } int same(int a, int b){ return find(a) == find(b); } void unite(int a, int b){ if(same(a, b)) return; a = find(a); b = find(b); if(saizu[a] < saizu[b]) swap(a, b); saizu[a] += saizu[b]; link[b] = a; } int getsize(int a){ return saizu[find(a)]; } }; const int mod = 1e9+7; ll mode(ll a){ a %= mod; if(a < 0) a += mod; return a; } ll subt(ll a, ll b){ return mode(mode(a)-mode(b)); } ll add(ll a, ll b){ return mode(mode(a)+mode(b)); } ll mult(ll a, ll b){ return mode(mode(a)*mode(b)); } ll binpow(ll a, ll b){ ll res = 1; while(b){ if(b&1) res = mult(res, a); a = mult(a, a); b >>= 1; } return res; } const int N = 1e5+7; ll n, k; ll y11[N], x1[N], x2[N], y2[N]; inline ll rect_size(ll x11, ll y1, ll x22, ll y22){ return (x22-x11+1)*(y22-y1+1); } inline ll pref(ll x, ll y, ll div){ ll res = 0; ll x_1_mod_div = (x+1)%div, y_1_mod_div = (y+1)%div; ll x_full = x-x_1_mod_div, y_full = y-y_1_mod_div; ll full_s1 = (x_full+1)/div, full_s2 = (y_full+1)/div; ll x_full_div = (x_full+1)/div, y_full_div = (y_full+1)/div; res += ((full_s1*full_s2)&1 ? full_s1*full_s2/2+1 : full_s1*full_s2/2)*div*div; ll tmp; if((y_full_div)&1){ ll flag = x/div+y_full/div; if(flag&1){ res += (x_1_mod_div)*(y_full_div/2)*div; } else{ res += (x_1_mod_div)*(y_full_div/2+1)*div; } } else{ tmp = (y_full+1)/2*(x_1_mod_div); res += tmp; } if((x_full_div)&1){ ll flag = y/div+x_full/div; if(flag&1){ res += (y_1_mod_div)*(x_full_div/2)*div; } else{ res += (y_1_mod_div)*(x_full_div/2+1)*div; } } else{ tmp = (x_full+1)/2*(y_1_mod_div); res += tmp; } ll flag = x/div+y/div; if(!(flag&1)){ res += rect_size(x_full+1, y_full+1, x, y); } return res; } inline ll calc1(ll div){ ll to_white = 0, to_black = ((n*n/div/div)&1 ? (n*n/div/div/2+1)*div*div : (n*n/2)); for(ll i = 0; i < k; i++){ ll blacks_in = pref(x2[i], y2[i], div)-(x1[i]-1 > -1 ? pref(x1[i]-1, y2[i], div) : 0)-(y11[i]-1 > -1 ? pref(x2[i], y11[i]-1, div) : 0)+ ((x1[i]-1 > -1) && (y11[i]-1 > -1) ? pref(x1[i]-1, y11[i]-1, div) : 0); to_black -= blacks_in; to_white += rect_size(x1[i], y11[i], x2[i], y2[i])-blacks_in; } return to_white+to_black; } int main(){ do_not_disturb ll ans = 9e18, i; cin >> n >> k; for(i = 0; i < k; i++){ cin >> x1[i] >> y11[i] >> x2[i] >> y2[i]; x1[i]--; y11[i]--; x2[i]--; y2[i]--; } for(i = 1; i*i <= n; i++){ if(n%i == 0){ auto tmp = calc1(i); ans = min(ans, min(tmp, n*n-tmp)); if(i > 1){ tmp = calc1(n/i); ans = min(ans, min(tmp, n*n-tmp)); } } } 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...