Submission #1283379

#TimeUsernameProblemLanguageResultExecution timeMemory
1283379MMihalevMosaic (IOI24_mosaic)C++20
22 / 100
1096 ms205680 KiB
#include<iostream>
#include<algorithm>
#include<vector>
#include "mosaic.h"
using namespace std;
const int MAX_N=2e5+5;
int n,q;
vector<long long>ans;
int a1[3][MAX_N];
int a2[MAX_N][3];
int a[5003][5003];
int p[5003][5003];
int query(int x1,int x2,int y1,int y2)
{
    return p[x2][y2]-p[x1-1][y2]-p[x2][y1-1]+p[x1-1][y1-1];
}
std::vector<long long> mosaic(std::vector<int> X, std::vector<int> Y,std::vector<int> T, std::vector<int> B,std::vector<int> L, std::vector<int> R)
{
    n=X.size();
    q=T.size();
    ans.resize(q);

    if(n<=5000)
    {
        for(int j=1;j<=n;j++)
        {
            a[1][j]=X[j-1];
        }
        for(int i=1;i<=n;i++)
        {
            a[i][1]=Y[i-1];
        }

        for(int i=2;i<=n;i++)
        {
            for(int j=2;j<=n;j++)
            {
                if(a[i-1][j]+a[i][j-1]==0)a[i][j]=1;
                else a[i][j]=0;
            }
        }

        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                p[i][j]=p[i-1][j]+a[i][j]+p[i][j-1]-p[i-1][j-1];
            }
        }

        for(int i=1;i<=q;i++)
        {
            ans[i-1]=query(T[i-1]+1,B[i-1]+1,L[i-1]+1,R[i-1]+1);
        }
        return ans;
    }

    for(int i=0;i<n;i++)
    {
        a1[0][i]=X[i];
    }
    for(int i=0;i<n;i++)
    {
        a2[i][0]=Y[i];
    }

    a1[1][0]=a2[1][0];
    for(int i=1;i<n;i++)
    {
        a1[1][i]=(a1[1][i-1]+a1[0][i]==0 ? 1 : 0);
    }
    a2[0][1]=a1[0][1];
    for(int i=1;i<n;i++)
    {
        a2[i][1]=(a2[i-1][i]+a2[i][0]==0 ? 1 : 0);
    }

    a1[2][0]=a2[2][0];a1[2][1]=a2[2][1];
    for(int i=2;i<n;i++)
    {
        a1[2][i]=(a1[2][i-1]+a1[1][i]==0 ? 1 : 0);
    }
    a2[0][2]=a1[0][2];a2[1][2]=a1[1][2];
    for(int i=2;i<n;i++)
    {
        a2[i][2]=(a2[i-1][2]+a2[i][1]==0 ? 1 : 0);
    }

    for(int i=1;i<=q;i++)
    {
        if(T[i-1]<3)
        {
            ans[i-1]=a1[T[i-1]][L[i-1]];
            continue;
        }
        if(L[i-1]<3)
        {
            ans[i-1]=a2[T[i-1]][L[i-1]];
            continue;
        }

        if(T[i-1]<L[i-1])
        {
            int x=T[i-1]-2;
            ans[i-1]=a1[2][L[i-1]-x];
        }
        else
        {
            int x=L[i-1]-2;
            ans[i-1]=a2[T[i-1]-x][2];
        }
    }

    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...