제출 #496975

#제출 시각아이디문제언어결과실행 시간메모리
496975GurbanChessboard (IZhO18_chessboard)C++17
0 / 100
45 ms8384 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int maxn=1e5+5; int n,k; int xl[maxn],yl[maxn]; int xr[maxn],yr[maxn]; vector<int>v[maxn],p[maxn]; bool col(int pos,int nw,int X){ int now = (pos + X - 1) / X; now %= 2; now ^= 1; return now ^ nw; } ll f(int X,int tp){ ll now = 0; int nw = tp ^ 1; for(int i = 1;i <= n;i++){ if(X == 1 or i % X == 1) nw ^= 1; if(!(tp ^ nw)) now += 1ll * (n/X + 1)/2 * X; else now += 1ll * (n/X) / 2 * X; } // if(X == 2 and tp == 1) cout<<now<<'\n'; nw = tp ^ 1; ll cnt[2]; cnt[0] = cnt[1] = 0; for(int i = 1;i <= n;i++){ if(i % X == 1 or X == 1){ nw ^= 1; swap(cnt[0],cnt[1]); } for(auto j : v[i]){ int z = xl[j] + (X + 1 - (xl[j] % X)); if(xl[j] % X == 0) z = xl[j] + 1; if(xr[j] < z){ int cln = col(xl[j],nw,X); cnt[cln] += (xr[j] - xl[j] + 1); continue; } if(xr[j] < z + X - 1){ int cln = col(xl[j],nw,X); cnt[cln] += (z - xl[j]); cln = col(xr[j],nw,X); cnt[cln] += (xr[j] - z + 1); continue; } int pos = xr[j] - (xr[j] % X) + 1; int cln = col(z,nw,X); cnt[cln] += ((pos - z) / X + 1)/2 * X; cnt[cln ^ 1] += ((pos-z)/X)/2 * X; cln = col(xl[j],nw,X); cnt[cln] += (z - xl[j]); cln = col(xr[j],nw,X); cnt[cln] += (xr[j] - pos + 1); } now += cnt[0]; now -= cnt[1]; // if(X == 3 and !tp) cout<<i<<' '<<nw<<' '<<cnt[0]<<' '<<cnt[1]<<'\n'; for(auto j : p[i]){ int z = xl[j] + (X + 1 - (xl[j] % X)); if(xr[j] < z){ int cln = col(xl[j],nw,X); cnt[cln] -= (xr[j] - xl[j] + 1); continue; } if(xr[j] < z + X - 1){ int cln = col(xl[j],nw,X); cnt[cln] -= (z - xl[j]); cln = col(xr[j],nw,X); cnt[cln] -= (xr[j] - z + 1); continue; } int pos = xr[j] - (xr[j] % X) + 1; int cln = col(z,nw,X); cnt[cln] -= ((pos - z) / X + 1)/2 * X; cnt[cln ^ 1] -= ((pos-z)/X)/2 * X; cln = col(xl[j],nw,X); cnt[cln] -= (z - xl[j]); cln = col(xr[j],nw,X); cnt[cln] -= (xr[j] - pos + 1); } } // cout<<X<<' '<<tp<<' '<<now<<'\n'; return now; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cin >> n >> k; for(int i = 1;i <= k;i++){ cin >> xl[i] >> yl[i] >> xr[i] >> yr[i]; v[yl[i]].push_back(i); p[yr[i]].push_back(i); } ll ans = 1ll * n * n; for(int i = 1;i < n;i++) if(n % i == 0){ ans=min(ans,f(i,0)); ans=min(ans,f(i,1)); } cout<<ans; }
#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...