Submission #1363802

#TimeUsernameProblemLanguageResultExecution timeMemory
1363802activedeltorre모자이크 (IOI24_mosaic)C++20
100 / 100
98 ms30192 KiB
#include "mosaic.h"
#include <cassert>
#include <cstdio>
#include <vector>


#include <vector>
#include <iostream>
using namespace std;
int lin[3][200005];
int col[3][200005];
int spar[3][200005];
int spar2[3][200005];
int coefdiag[400005];
long long sumup[400005];
long long sumdo[400005];
long long sums[400005];
int nmax=200000;
long long diag(int i,int j)
{
    if(i<0 || j<0)
    {
        return 0;
    }
    int a=nmax-i;
    int b=min(nmax,nmax+j-i);
    int c=max(nmax,nmax+j-i);
    int d=nmax+j;
    long long sum=0,coef=1;
    sum+=sumup[b-1]-sumup[a-1]-(a-1)*(sums[b-1]-sums[a-1]);
    sum+=(sums[c]-sums[b-1])*(b-a+1);
    sum+=(sumdo[d]-sumdo[c])+(d+1)*(sums[d]-sums[c]);
    return sum;
}
long long solve(int i,int j)
{
    if(i<0 || j<0)
    {
        return 0;
    }
    long long sum=0;
    if(i>=1 && j>=1)
    {
        sum=spar[0][j]+spar[1][j]+spar2[0][i]+spar2[1][i]-spar[0][1]-spar[1][1];
    }
    else if(i>=1)
    {
        sum=spar2[0][i];
    }
    else if(j>=1)
    {
        sum=spar[0][j];
    }
    else
    {
        sum=spar[0][0];
    }
    return sum+diag(i-2,j-2);
}
void build()
{
    for(int i=1;i<=nmax*2;i++)
    {
        sumup[i]=sumup[i-1]+i*coefdiag[i];
    }
    for(int i=1;i<=nmax*2;i++)
    {
        sumdo[i]=sumdo[i-1]-i*coefdiag[i];
    }
    for(int i=1;i<=nmax*2;i++)
    {
        sums[i]=sums[i-1]+coefdiag[i];
    }
}
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)
{
    int Q=L.size();
    std::vector<long long> C(Q, 0);
    int n=X.size();
    for(int i=0; i<n; i++)
    {
        lin[0][i]=X[i];
    }
    for(int i=0; i<n; i++)
    {
        col[0][i]=Y[i];
    }
    for(int i=1; i<=2; i++)
    {
        lin[i][0]=col[0][i];
        //cout<<"lin"<<" "<<i<<"\n";
        for(int j=1; j<n; j++)
        {
            lin[i][j]=1^(lin[i-1][j]|lin[i][j-1]);
            //cout<<lin[i][j]<<" ";
        }
        //cout<<'\n';
    }

    for(int i=1; i<=2; i++)
    {
        col[i][0]=lin[0][i];
        // cout<<"col"<<" "<<i<<"\n";
        for(int j=1; j<n; j++)
        {
            col[i][j]=1^(col[i-1][j]|col[i][j-1]);
            //cout<<col[i][j]<<" ";
        }
        //cout<<'\n';
    }
    for(int i=0; i<=1; i++)
    {
        spar[i][0]=lin[i][0];
        spar2[i][0]=col[i][0];
        for(int j=1; j<n; j++)
        {
            spar[i][j]=spar[i][j-1]+lin[i][j];
            spar2[i][j]=spar2[i][j-1]+col[i][j];
        }
    }
    for(int j=2; j<n; j++)
    {
        coefdiag[j+nmax-2]=lin[2][j];
    }
    for(int j=2; j<n; j++)
    {
        coefdiag[nmax-j+2]=col[2][j];
    }
    build();
    for(int i=0; i<Q; i++)
    {
        long long rez=0;
        rez=solve(B[i],R[i])-solve(B[i],L[i]-1)-solve(T[i]-1,R[i])+solve(T[i]-1,L[i]-1);
        C[i]=rez;
    }
    return C;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...