Submission #1203250

#TimeUsernameProblemLanguageResultExecution timeMemory
1203250AlgorithmWarriorMosaic (IOI24_mosaic)C++20
100 / 100
98 ms31048 KiB
#include <bits/stdc++.h> using namespace std; vector<long long>subtask3(vector<int>&X,vector<int>&Y,vector<int>&T,vector<int>&B,vector<int>&L,vector<int>&R){ int n=X.size(); vector<int>sp(n+5,0); int i; for(i=1;i<=n;++i) sp[i]=sp[i-1]+X[i-1]; int q=T.size(); vector<long long>answer; for(i=0;i<q;++i){ int left=L[i]+1; int right=R[i]+1; answer.push_back(sp[right]-sp[left-1]); } return answer; } vector<long long>subtask4(vector<int>&X,vector<int>&Y,vector<int>&T,vector<int>&B,vector<int>&L,vector<int>&R){ int n=X.size(); vector<vector<bool>>mat(n+5,vector<bool>(n+5,0)); vector<vector<int>>sp(n+5,vector<int>(n+5,0)); int i,j; for(j=1;j<=n;++j) mat[1][j]=X[j-1]; for(i=1;i<=n;++i) mat[i][1]=Y[i-1]; for(i=2;i<=n;++i) for(j=2;j<=n;++j) mat[i][j]=((!mat[i-1][j] && !mat[i][j-1])?1:0); for(i=1;i<=n;++i) for(j=1;j<=n;++j) sp[i][j]=sp[i-1][j]+sp[i][j-1]-sp[i-1][j-1]+mat[i][j]; vector<long long>answer; int q=T.size(); for(i=0;i<q;++i){ int top=T[i]+1; int bottom=B[i]+1; int left=L[i]+1; int right=R[i]+1; answer.push_back(sp[bottom][right]-sp[bottom][left-1]-sp[top-1][right]+sp[top-1][left-1]); } return answer; } vector<long long>subtask5(vector<int>&X,vector<int>&Y,vector<int>&T,vector<int>&B,vector<int>&L,vector<int>&R){ int q=T.size(); int i; vector<long long>answer; for(i=0;i<q;++i){ int top=T[i]; int bottom=B[i]; int left=L[i]; int right=R[i]; top=max(top,1); left=max(left,1); if(top>bottom || left>right) answer.push_back(0); else{ long long arie=1LL*(bottom-top+1)*(right-left+1); int first_val=(top+left+1)%2; if(arie&1 && first_val) answer.push_back(arie/2+1); else answer.push_back(arie/2); } } return answer; } int get_diag(int x,int y,int n){ return n-x+y; } vector<long long>subtask6(vector<int> X, vector<int> Y, vector<int> T, vector<int> B,vector<int> L, vector<int> R){ int n=X.size(); vector<bool>lin[3]; vector<bool>col[3]; int i; for(i=0;i<3;++i){ lin[i].resize(n+5,0); col[i].resize(n+5,0); } for(i=0;i<n;++i) lin[0][i]=X[i]; for(i=0;i<n;++i) col[0][i]=Y[i]; lin[1][0]=col[0][1]; lin[2][0]=col[0][2]; col[1][0]=lin[0][1]; col[2][0]=lin[0][2]; for(i=1;i<n;++i){ lin[1][i]=(!lin[1][i-1] && !lin[0][i])?1:0; lin[2][i]=(!lin[2][i-1] && !lin[1][i])?1:0; col[1][i]=(!col[1][i-1] && !col[0][i])?1:0; col[2][i]=(!col[2][i-1] && !col[1][i])?1:0; } vector<bool>diag(2*n+5,0); for(i=2;i<n;++i) if(lin[2][i]) diag[get_diag(2,i,n)]=1; for(i=2;i<n;++i) if(col[2][i]) diag[get_diag(i,2,n)]=1; int q=T.size(); vector<long long>answer; for(i=0;i<q;++i){ int l=T[i]; int c=L[i]; if(l<3){ answer.push_back(lin[l][c]); } else if(c<3){ answer.push_back(col[c][l]); } else{ answer.push_back(diag[get_diag(l,c,n)]); } } return answer; } int bin_search(vector<int>&diag,int val){ ///prima val care il intrece sau e egal int l=-1,r=diag.size()-1; /// (l r] while(r-l>1){ int mid=(l+r)/2; if(diag[mid]>=val) r=mid; else l=mid; } return r; } vector<long long>subtask7(vector<int> X, vector<int> Y, vector<int> T, vector<int> B,vector<int> L, vector<int> R){ int n=X.size(); vector<bool>lin[3]; vector<bool>col[3]; int i; for(i=0;i<3;++i){ lin[i].resize(n+5,0); col[i].resize(n+5,0); } for(i=0;i<n;++i) lin[0][i]=X[i]; for(i=0;i<n;++i) col[0][i]=Y[i]; lin[1][0]=col[0][1]; lin[2][0]=col[0][2]; col[1][0]=lin[0][1]; col[2][0]=lin[0][2]; for(i=1;i<n;++i){ lin[1][i]=(!lin[1][i-1] && !lin[0][i])?1:0; lin[2][i]=(!lin[2][i-1] && !lin[1][i])?1:0; col[1][i]=(!col[1][i-1] && !col[0][i])?1:0; col[2][i]=(!col[2][i-1] && !col[1][i])?1:0; } vector<int>diag; for(i=n-1;i>2;--i) if(col[2][i]) diag.push_back(get_diag(i,2,n)); for(i=2;i<n;++i) if(lin[2][i]) diag.push_back(get_diag(2,i,n)); vector<int>splin[3]; vector<int>spcol[3]; int j; for(i=0;i<3;++i){ splin[i].resize(n+5,0); spcol[i].resize(n+5,0); } for(i=0;i<3;++i){ splin[i][0]=lin[i][0]; spcol[i][0]=col[i][0]; for(j=1;j<n;++j){ splin[i][j]=splin[i][j-1]+lin[i][j]; spcol[i][j]=spcol[i][j-1]+col[i][j]; } } int q=T.size(); vector<long long>answer; diag.push_back(2e9); for(i=0;i<q;++i){ int top=T[i]; int bottom=B[i]; int left=L[i]; int right=R[i]; if(top<3){ answer.push_back(splin[top][right]-splin[top][left-1]); } else{ int cnt=0; if(left<=0 && 0<=right){ cnt+=col[0][top]; ++left; } if(left<=1 && 1<=right){ cnt+=col[1][top]; ++left; } if(left>right) answer.push_back(cnt); else{ int ind1=bin_search(diag,get_diag(top,left,n)); int ind2=bin_search(diag,get_diag(top,right,n)+1); answer.push_back(ind2-ind1+cnt); } } } return answer; } long long spdst(int d1,int d2,vector<int>&cnt,vector<long long>&sum){ return sum[d2]-sum[d1-1]-1LL*cnt[d1-1]*(d2-d1+1); } long long spddr(int d1,int d2,vector<int>&cnt,vector<long long>&sum){ return sum[d1]-sum[d2+1]-1LL*cnt[d2+1]*(d2-d1+1); } long long get_answer(int top,int bottom,int left,int right,int n,vector<int>&cntst,vector<int>&cntdr,vector<long long>&sumst,vector<long long>&sumdr){ if(bottom-left>right-left){ int diag1=get_diag(top,left,n); int diag2=get_diag(bottom,right,n); int diag3=get_diag(top,right,n); int diag4=get_diag(bottom,left,n); return 1LL*(right-left+1)*(cntst[diag1]-cntst[diag2-1])+spdst(diag1+1,diag3,cntst,sumst)+spddr(diag4,diag2-1,cntdr,sumdr); } else{ int diag1=get_diag(top,left,n); int diag2=get_diag(bottom,right,n); int diag3=get_diag(top,right,n); int diag4=get_diag(bottom,left,n); return 1LL*(bottom-top+1)*(cntst[diag2]-cntst[diag1-1])+spdst(diag2+1,diag3,cntst,sumst)+spddr(diag4,diag1-1,cntdr,sumdr); } } vector<long long>subtask8(vector<int> X, vector<int> Y, vector<int> T, vector<int> B,vector<int> L, vector<int> R){ int n=X.size(); vector<bool>lin[3]; vector<bool>col[3]; int i; for(i=0;i<3;++i){ lin[i].resize(n+5,0); col[i].resize(n+5,0); } for(i=0;i<n;++i) lin[0][i]=X[i]; for(i=0;i<n;++i) col[0][i]=Y[i]; lin[1][0]=col[0][1]; lin[2][0]=col[0][2]; col[1][0]=lin[0][1]; col[2][0]=lin[0][2]; for(i=1;i<n;++i){ lin[1][i]=(!lin[1][i-1] && !lin[0][i])?1:0; lin[2][i]=(!lin[2][i-1] && !lin[1][i])?1:0; col[1][i]=(!col[1][i-1] && !col[0][i])?1:0; col[2][i]=(!col[2][i-1] && !col[1][i])?1:0; } vector<int>splin[3]; vector<int>spcol[3]; int j; for(i=0;i<3;++i){ splin[i].resize(n+5,0); spcol[i].resize(n+5,0); } for(i=0;i<3;++i){ splin[i][0]=lin[i][0]; spcol[i][0]=col[i][0]; for(j=1;j<n;++j){ splin[i][j]=splin[i][j-1]+lin[i][j]; spcol[i][j]=spcol[i][j-1]+col[i][j]; } } vector<bool>diag(2*n+5,0); for(i=2;i<n;++i) if(lin[2][i]) diag[get_diag(2,i,n)]=1; for(i=2;i<n;++i) if(col[2][i]) diag[get_diag(i,2,n)]=1; vector<int>cntst(2*n+5,0); vector<int>cntdr(2*n+5,0); vector<long long>sumst(2*n+5,0); vector<long long>sumdr(2*n+5,0); for(i=0;i<2*n+5;++i){ cntst[i]=cntst[i-1]+diag[i]; sumst[i]=sumst[i-1]+cntst[i]; } for(i=2*n+4;i>=0;--i){ cntdr[i]=cntdr[i+1]+diag[i]; sumdr[i]=sumdr[i+1]+cntdr[i]; } int q=T.size(); vector<long long>answer; for(i=0;i<q;++i){ int top=T[i]; int bottom=B[i]; int left=L[i]; int right=R[i]; int cnt=0; if(top==0){ cnt+=splin[0][right]-((left)?splin[0][left-1]:0); ++top; } if(top>bottom){ answer.push_back(cnt); continue; } if(top==1){ cnt+=splin[1][right]-((left)?splin[1][left-1]:0); ++top; } if(top>bottom){ answer.push_back(cnt); continue; } if(left==0){ cnt+=spcol[0][bottom]-((top)?spcol[0][top-1]:0); ++left; } if(left>right){ answer.push_back(cnt); continue; } if(left==1){ cnt+=spcol[1][bottom]-((top)?spcol[1][top-1]:0); ++left; } if(left>right){ answer.push_back(cnt); continue; } answer.push_back(get_answer(top,bottom,left,right,n,cntst,cntdr,sumst,sumdr)+cnt); } return answer; } vector<long long> mosaic(vector<int> X, vector<int> Y, vector<int> T, vector<int> B,vector<int> L, vector<int> R){ return subtask8(X,Y,T,B,L,R); }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...