Submission #385451

#TimeUsernameProblemLanguageResultExecution timeMemory
385451vanicChessboard (IZhO18_chessboard)C++14
100 / 100
811 ms4460 KiB
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <set> #include <stack> #include <map> #include <queue> #include <vector> #include <cstring> #include <array> #include <bitset> #include <cassert> using namespace std; typedef long long ll; const int maxn=1e5+5; array < int, 4 > l[maxn]; ll n, k; inline ll dodaj(ll val, int br, bool p){ if((br&1 && p) || (!(br&1) && !p)){ return val; } return 0; } bool stima(int br, bool p){ return (br&1 && p) || (!(br&1) && !p); } ll probaj(ll val, bool p){ ll br=0; ll x1, y1, x2, y2; ll pocx, pocy, krajx, krajy; ll cor1, cor2, cor3, cor4; for(int i=0; i<k; i++){ x1=l[i][0]; y1=l[i][1]; x2=l[i][2]; y2=l[i][3]; pocx=x1/val; pocy=y1/val; krajx=x2/val; krajy=y2/val; if(pocx==krajx && pocy==krajy){ // cout << "izi!" << endl; br+=dodaj((x2-x1+1)*(y2-y1+1), pocx+pocy, p); } else if(pocx==krajx){ // cout << "tu sam!" << endl; cor1=x1; cor2=y1; cor3=min(x2, (pocx+1)*val-1); cor4=min(y2, (pocy+1)*val-1); // cout << cor1 << ' ' << cor2 << ' ' << cor3 << ' ' << cor4 << endl; br+=dodaj((cor3-cor1+1)*(cor4-cor2+1), pocx+pocy, p); cor1=max(x1, krajx*val);// cor2=max(y1, krajy*val);//fixaj svugdje! bilo je poc cor3=x2; cor4=y2; // cout << cor1 << ' ' << cor2 << ' ' << cor3 << ' ' << cor4 << endl; br+=dodaj((cor3-cor1+1)*(cor4-cor2+1), krajx+krajy, p); //fixaj i ovo pocy++; krajy--; if(pocy>krajy){ continue; } cor1=x1; cor2=pocy*val; cor3=x2; cor4=(pocy+1)*val-1; // cout << cor1 << ' ' << cor2 << ' ' << cor3 << ' ' << cor4 << endl; // cout << pocy << ' ' << krajy << endl; if(stima(pocx+pocy, p)){ br+=(cor3-cor1+1)*(cor4-cor2+1)*((krajy-pocy+2)/2); } else{ br+=(cor3-cor1+1)*(cor4-cor2+1)*((krajy-pocy+1)/2); } } else if(pocy==krajy){ // cout << "ovdje!" << endl; cor1=x1; cor2=y1; cor3=min(x2, (pocx+1)*val-1); cor4=min(y2, (pocy+1)*val-1); br+=dodaj((cor3-cor1+1)*(cor4-cor2+1), pocx+pocy, p); cor1=max(x1, krajx*val); cor2=max(y1, krajy*val); cor3=x2; cor4=y2; br+=dodaj((cor3-cor1+1)*(cor4-cor2+1), krajx+krajy, p); pocx++; krajx--; if(pocx>krajx){ continue; } cor1=pocx*val; cor2=y1; cor3=(pocx+1)*val-1; cor4=y2; if(stima(pocx+pocy, p)){ br+=(cor3-cor1+1)*(cor4-cor2+1)*((krajx-pocx+2)/2); } else{ br+=(cor3-cor1+1)*(cor4-cor2+1)*((krajx-pocx+1)/2); } } else{ // cout << "kunito!" << endl; cor1=x1; cor2=y1; cor3=min(x2, (pocx+1)*val-1); cor4=min(y2, (pocy+1)*val-1); br+=dodaj((cor3-cor1+1)*(cor4-cor2+1), pocx+pocy, p); cor1=max(x1, krajx*val); cor2=max(y1, krajy*val); cor3=x2; cor4=y2; br+=dodaj((cor3-cor1+1)*(cor4-cor2+1), krajx+krajy, p); cor1=x1; cor2=max(y1, krajy*val); cor3=min(x2, (pocx+1)*val-1); cor4=y2; br+=dodaj((cor3-cor1+1)*(cor4-cor2+1), pocx+krajy, p); cor1=max(x1, krajx*val); cor2=y1; cor3=x2; cor4=min(y2, (pocy+1)*val-1); br+=dodaj((cor3-cor1+1)*(cor4-cor2+1), krajx+pocy, p); // cout << br << endl; pocx++; krajx--; if(krajx>=pocx){ cor1=pocx*val; cor2=y1; cor3=(pocx+1)*val-1; cor4=(pocy+1)*val-1; // cout << cor1 << ' ' << cor2 << ' ' << cor3 << ' '<< cor4 << endl; // cout << pocx << ' ' << pocy << endl; if(stima(pocx+pocy, p)){ br+=(cor3-cor1+1)*(cor4-cor2+1)*((krajx-pocx+2)/2); } else{ // cout << "uso" << endl; br+=(cor3-cor1+1)*(cor4-cor2+1)*((krajx-pocx+1)/2); // cout << br << endl; } cor2=krajy*val; cor4=y2; if(stima(pocx+krajy, p)){ br+=(cor3-cor1+1)*(cor4-cor2+1)*((krajx-pocx+2)/2); } else{ br+=(cor3-cor1+1)*(cor4-cor2+1)*((krajx-pocx+1)/2); } } pocx--; krajx++; pocy++; krajy--; if(krajy>=pocy){ cor1=x1; cor2=pocy*val; cor3=(pocx+1)*val-1; cor4=(pocy+1)*val-1; if(stima(pocx+pocy, p)){ br+=(cor3-cor1+1)*(cor4-cor2+1)*((krajy-pocy+2)/2); } else{ br+=(cor3-cor1+1)*(cor4-cor2+1)*((krajy-pocy+1)/2); } cor1=krajx*val; cor3=x2; if(stima(krajx+pocy, p)){ br+=(cor3-cor1+1)*(cor4-cor2+1)*((krajy-pocy+2)/2); } else{ br+=(cor3-cor1+1)*(cor4-cor2+1)*((krajy-pocy+1)/2); } } pocy--; krajy++; // cout << br << endl; if(((pocx+pocy)&1 && p) || (!((pocx+pocy)&1) && !p)){ br+=((krajx-pocx-1)*(krajy-pocy-1)+1)/2*val*val; } else{ br+=(krajx-pocx-1)*(krajy-pocy-1)/2*val*val; } } } // cout << br << endl; return br; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> k; ll uk=0; int a, b, c, d; // cout << "proso" << endl; for(int i=0; i<k; i++){ // cout << "uso" << endl; cin >> a >> b >> c >> d; a--; b--; c--; d--; uk+=(ll)(c-a+1)*(d-b+1); l[i]={a, b, c, d}; } ll sol=1e18; ll br1, br2; ll crno, bijelo; for(ll i=1; i*i<=n; i++){ // cout << "na " << i << endl; if(n%i==0){ br1=probaj(i, 0); br2=probaj(i, 1); crno=((n/i)*(n/i)+1)/2*i*i; bijelo=(n/i)*(n/i)/2*i*i; // cout << "boje " << bijelo << ' ' << crno << endl; // cout << "brojevi " << br1 << ' ' << br2 << endl; sol=min(sol, crno-br1+uk-br1); swap(crno, bijelo); sol=min(sol, crno-br2+uk-br2); if(i!=1 && i*i!=n){ br1=probaj(n/i, 0); br2=probaj(n/i, 1); crno=(i*i+1)/2*(n/i)*(n/i); bijelo=i*i/2*(n/i)*(n/i); sol=min(sol, crno-br1+uk-br1); swap(crno, bijelo); sol=min(sol, crno-br2+uk-br2); } } } cout << sol << '\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...