#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |