Submission #1232676

#TimeUsernameProblemLanguageResultExecution timeMemory
1232676Muhammad_AneeqMosaic (IOI24_mosaic)C++20
78 / 100
1096 ms204580 KiB
#include "mosaic.h" #include <vector> #include <algorithm> #include <set> #include <iostream> using namespace std; set<int>st; int const N=2e5+10; int prex[3][N]={},prey[3][N]={}; void mk(vector<int>x,vector<int>y) { st={}; int n=x.size(); int m=min(6,n); vector<vector<int>>gr(n,vector<int>(m,0)); for (int i=0;i<n;i++) gr[i][0]=y[i]; for (int i=0;i<m;i++) gr[0][i]=x[i]; for (int i=1;i<n;i++) { for (int j=1;j<m;j++) { if (gr[i-1][j]==0&&gr[i][j-1]==0) { gr[i][j]=1; st.insert(j-i); } else gr[i][j]=0; } } for (int i=0;i<min(n,2);i++) for (int j=0;j<n;j++) prey[i+1][j+1]=prey[i+1][j]+prey[i][j+1]-prey[i][j]+gr[j][i]; gr=vector<vector<int>>(m,vector<int>(n,0)); for (int i=0;i<m;i++) gr[i][0]=y[i]; for (int i=0;i<n;i++) gr[0][i]=x[i]; for (int i=1;i<m;i++) { for (int j=1;j<n;j++) { if (gr[i-1][j]==0&&gr[i][j-1]==0) { gr[i][j]=1; st.insert(j-i); } else gr[i][j]=0; } } for (int i=0;i<min(n,2);i++) for (int j=0;j<n;j++) prex[i+1][j+1]=prex[i+1][j]+prex[i][j+1]-prex[i][j]+gr[i][j]; } vector<long long> mosaic(vector<int> X, vector<int> Y,vector<int> T, vector<int> B,vector<int> L, vector<int> R) { int q=T.size(); vector<long long>ans; int n=X.size(); if (n<=5000) { int gr[n][n]={}; for (int i=0;i<n;i++) gr[i][0]=Y[i],gr[0][i]=X[i]; for (int i=1;i<n;i++) { for (int j=1;j<n;j++) { if (gr[i-1][j]==0&&gr[i][j-1]==0) gr[i][j]=1; } } int pre[n+1][n+1]={}; for (int i=0;i<n;i++) for (int j=0;j<n;j++) pre[i+1][j+1]=pre[i+1][j]+pre[i][j+1]-pre[i][j]+gr[i][j]; for (int i=0;i<q;i++) { long long sm=pre[B[i]+1][R[i]+1]-pre[B[i]+1][L[i]]-pre[T[i]][R[i]+1]+pre[T[i]][L[i]]; ans.push_back(sm); } return ans; } mk(X,Y); if (prex[1][n]==0&&prey[1][n]==0) { for (int i=0;i<q;i++) { long long sm=0; if (T[i]==0) T[i]++; if (L[i]==0) L[i]++; if (T[i]>B[i]||L[i]>R[i]) { ans.push_back(0); continue; } long long len=(R[i]-L[i]+1); long long len1=(B[i]-T[i]+1); sm=(len*(len1))/2; if (len1%2&&len%2) { if ((T[i]+L[i])%2==0) sm++; } ans.push_back(sm); } return ans; } vector<int>segs; for (auto i:st) segs.push_back(i); for (int i=0;i<q;i++) { long long sm=0; if (T[i]<=1) { int nx=min(B[i],1)+1; sm=prex[nx][R[i]+1]-prex[nx][L[i]]-prex[T[i]][R[i]+1]+prex[T[i]][L[i]]; } if (L[i]<=1) { int nx=min(R[i],1)+1; sm+=prey[nx][B[i]+1]-prey[nx][T[i]]-prey[L[i]][B[i]+1]+prey[L[i]][T[i]]; } if (L[i]<=1&&T[i]<=1) { int nxy=min(R[i],1)+1; int nxx=min(B[i],1)+1; sm-=(prex[nxx][nxy]-prex[nxx][L[i]]-prex[T[i]][nxy]+prex[T[i]][L[i]]); } L[i]=max(L[i],2); T[i]=max(T[i],2); for (int j=T[i];j<=B[i];j++) { if (L[i]>R[i]) break; int z=lower_bound(begin(segs),end(segs),L[i]-j)-begin(segs); int y=upper_bound(begin(segs),end(segs),R[i]-j)-begin(segs); sm+=(y-z); } ans.push_back(sm); } return 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...