제출 #69272

#제출 시각아이디문제언어결과실행 시간메모리
69272istleminChessboard (IZhO18_chessboard)C++14
100 / 100
1727 ms61384 KiB
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i = a; i<int(b);++i) #define all(v) v.begin(),v.end() #define sz(v) v.size() #define trav(a,c) for(auto a: c) typedef long long ll; typedef vector<ll> vi; typedef pair<ll,ll> pii; ll n,k; ll ceilDiv(ll a,ll b){ return a/b + (a%b!=0); } ll getNumBlack(ll x1,ll y1,ll x2,ll y2, ll sq){ ll x12 = ceilDiv(x1,sq); ll y12 = ceilDiv(y1,sq); ll x22 = x2/sq; ll y22 = y2/sq; if((x12+y12)%2==0){ //black in left lower corner ll r1,r2; if(x22<x12){ r1 = 0; r2 = x2-x1; } else if((x22-x12+2)%2==1){ r1 = ((x22-x12)/2+1)*sq; r2 = ((x22-x12)/2)*sq + (x2-x22*sq) + (x12*sq-x1); } else { r1 = (x22-x12)/2*sq + (x2-x22*sq); r2 = (x22-x12)/2*sq + (x12*sq-x1); } ll c1,c2; if(y22<y12){ c1 = 0; c2 = y2-y1; } else if((y22-y12+2)%2==1){ c1 = ((y22-y12)/2+1)*sq; c2 = ((y22-y12)/2)*sq + (y2-y22*sq) + (y12*sq-y1); } else { c1 = (y22-y12)/2*sq + (y2-y22*sq); c2 = (y22-y12)/2*sq + (y12*sq-y1); } return r1*c1+r2*c2; } else { ll r1,r2; if(x22<x12){ r1 = 0; r2 = x2-x1; } else if((x22-x12+2)%2==1){ r1 = ((x22-x12)/2+1)*sq; r2 = ((x22-x12)/2)*sq + (x2-x22*sq) + (x12*sq-x1); } else { r1 = (x22-x12)/2*sq + (x2-x22*sq); r2 = (x22-x12)/2*sq + (x12*sq-x1); } ll c1,c2; if(y22<y12){ c1 = 0; c2 = y2-y1; } else if((y22-y12)%2==1){ c1 = ((y22-y12)/2+1)*sq; c2 = ((y22-y12)/2)*sq + (y2-y22*sq) + (y12*sq-y1); } else { c1 = (y22-y12)/2*sq + (y2-y22*sq); c2 = (y22-y12)/2*sq + (y12*sq-y1); } return r1*c2+r2*c1; } } vector<tuple<ll,ll,ll,ll> > v; ll getCost(ll sq, bool startWhite){ ll blackToBlack = 0; ll blackToWhite = 0; ll whiteToWhite, whiteToBlack; if((n/sq)%2==1){ whiteToWhite = ((n/sq)*(n/sq)/2)*sq*sq; whiteToBlack = ((n/sq)*(n/sq)/2+1)*sq*sq; } else { whiteToWhite = ((n/sq)*(n/sq)/2)*sq*sq; whiteToBlack = ((n/sq)*(n/sq)/2)*sq*sq; } if(startWhite) swap(whiteToBlack,whiteToWhite); rep(i,0,k){ ll x1,y1,x2,y2; tie(x1,y1,x2,y2) = v[i]; ll sz = (x2-x1)*(y2-y1); ll numBlack = getNumBlack(x1,y1,x2,y2,sq); if(startWhite) numBlack = sz-numBlack; whiteToBlack -= numBlack; blackToBlack += numBlack; whiteToWhite -= sz-numBlack; blackToWhite += sz-numBlack; } return whiteToBlack + blackToWhite; } int main(){ cin.sync_with_stdio(false); cin>>n>>k; rep(i,0,k){ ll x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; --x1;--y1; v.emplace_back(x1,y1,x2,y2); } /*ll numDivs = 0; rep(i,1,n) if(n%i==0) numDivs++; cout<<numDivs<<endl;*/ ll bestCost = 1e18; rep(i,1,n){ if(n%i==0){ bestCost = min(bestCost,getCost(i,false)); bestCost = min(bestCost,getCost(i,true)); } } cout<<bestCost<<endl; //cout<<getNumBlack(3,5,5,7,4)<<endl; //return 0; /*srand(time(NULL)); rep(i,0,1000){ ll x2 = rand()%10+1; ll y2 = rand()%10+1; ll x1 = rand()%x2; ll y1 = rand()%y2; cout<<getNumBlack(x1,y1,x2,y2,rand()%10+1)<<endl; }*/ /*ll w = 7; ll h = 5; rep(i,0,10){ rep(j,0,10){ cout<<(getNumBlack(j,i,j+w,i+h,2)==(w*h/2))<<" "; } cout<<endl; }*/ }
#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...