Submission #1364730

#TimeUsernameProblemLanguageResultExecution timeMemory
1364730vivkostovMosaic (IOI24_mosaic)C++20
70 / 100
95 ms45088 KiB
#include "mosaic.h"
#include <bits/stdc++.h>
using namespace std;
struct cell
{
    int i1,j1,i2,j2;
};
int n,q,a[200005],b[200005],c[200005],d[200005],mat[50][50];
vector<int>v[200005],br[200005];
vector<int>bb,pp;
cell g[200005];
vector<long long int>otg;
void print()
{
    for(int i=0;i<n;i++)
    {
        cout<<v[0][i]<<" ";
    }
    cout<<endl;
    for(int i=0;i<n;i++)
    {
        cout<<v[1][i]<<" ";
    }
    cout<<endl;
    for(int i=0;i<n;i++)
    {
        cout<<v[2][i]<<" ";
    }
    cout<<endl;
    for(int i=3;i<n;i++)
    {
        for(int j=0;j<3;j++)
        {
            cout<<v[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<endl;
}
void fix_br(int i,int j)
{
    if(j==0&&i<2)
    {
        br[i].push_back(v[i][j]);
        return;
    }
    if(i==2&&j<2)
    {
        br[i].push_back(v[i][j]);
        return;
    }
    if(i<2)
    {
        br[i].push_back(br[i][j-1]+v[i][j]);
        return;
    }
    if(i>2&&j<2)
    {
        br[i].push_back(br[i-1][j]+v[i][j]);
        return;
    }
}
void dumb()
{
    for(int i=1;i<n;i++)
    {
        for(int j=1;j<n;j++)
        {
            mat[i][j]=((mat[i-1][j]|mat[i][j-1])^1);
        }
    }
    int br=0;
    for(int z=1;z<=q;z++)
    {
        br=0;
        for(int i=g[z].i1;i<=g[z].i2;i++)
        {
            for(int j=g[z].j1;j<=g[z].j2;j++)
            {
                br+=mat[i][j];
            }
        }
        otg.push_back(br);
    }
}
void dob(long long int&ot,int ind,int sz,int mi)
{
    ot+=(pp[ind+mi-1]-pp[ind-1])-((ind-1)*(bb[ind+mi-1]-bb[ind-1]));
    ind+=mi;
    sz-=mi;
    if(sz>mi)
    {
        int lef=sz-mi;
        ot+=(bb[ind+lef-1]-bb[ind-1])*mi;
        sz-=lef;
        ind+=lef;
    }
    if(sz)
    {
        ot+=(ind+sz)*(bb[ind+sz-1]-bb[ind-1])-(pp[ind+sz-1]-pp[ind-1]);
    }
}
vector<long long> mosaic(vector<int> X,vector<int> Y,vector<int> T,vector<int> B,vector<int> L,vector<int> R)
{
    n=X.size();
    q=T.size();
    for(int i=0;i<q;i++)
    {
        g[i+1].i1=T[i];
        g[i+1].i2=B[i];
        g[i+1].j1=L[i];
        g[i+1].j2=R[i];
    }
    if(n<=2)
    {
        for(int i=0;i<n;i++)
        {
            mat[0][i]=X[i];
        }
        for(int i=0;i<n;i++)
        {
            mat[i][0]=Y[i];
        }
        dumb();
        return otg;
    }
    for(int i=0;i<n;i++)
    {
        v[0].push_back(X[i]);
        if(i)
        {
            v[i].push_back(Y[i]);
        }
    }
    for(int i=1;i<n;i++)
    {
        v[1].push_back((v[1][i-1]|v[0][i])^1);
        if(i!=1)v[i].push_back((v[i-1][1]|v[i][0])^1);
    }
    for(int i=2;i<n;i++)
    {
        v[2].push_back((v[2][i-1]|v[1][i])^1);
        if(i!=2)
        {
            v[i].push_back((v[i-1][2]|v[i][1])^1);
        }
    }
    int sz;
    for(int i=0;i<n;i++)
    {
        sz=n;
        if(i>1)sz=2;
        for(int j=0;j<sz;j++)
        {
            fix_br(i,j);
        }
    }
    int last=0,lastp=0,cur=1;
    bb.push_back(0);
    pp.push_back(0);
    for(int i=n-1;i>=2;i--)
    {
        bb.push_back(v[2][i]+last);
        pp.push_back(v[2][i]*cur+lastp);
        last=bb.back();
        lastp=pp.back();
        cur++;
    }
    for(int i=3;i<n;i++)
    {
        bb.push_back(v[i][2]+last);
        pp.push_back(v[i][2]*cur+lastp);
        last=bb.back();
        lastp=pp.back();
        cur++;
    }
    long long int ot=0;
    int st;
    //print();
    for(int z=1;z<=q;z++)
    {
        ot=0;
        for(int i=g[z].i1;i<min(g[z].i2+1,2);i++)
        {
            ot+=br[i][g[z].j2];
            if(g[z].j1)ot-=br[i][g[z].j1-1];
        }
        if(g[z].i2>1)
        {
            for(int j=g[z].j1;j<min(g[z].j2+1,2);j++)
            {
                ot+=br[g[z].i2][j];
                if(g[z].i1>2)ot-=br[g[z].i1-1][j];
            }
        }
        g[z].i1=max(g[z].i1,2);
        g[z].j1=max(g[z].j1,2);
        if(g[z].i1>g[z].i2||g[z].j1>g[z].j2)
        {
            otg.push_back(ot);
            continue;
        }
        st=g[z].j2-g[z].j1+1+g[z].i2-g[z].i1;
        //cout<<g[z].i1<<" "<<g[z].i2<<" "<<g[z].j1<<" "<<g[z].j2<<endl;
        if(g[z].i1<=g[z].j2)
        {
            //cout<<n-(g[z].j2-(g[z].i1-2))<<endl;
            dob(ot,n-(g[z].j2-(g[z].i1-2)),st,min(g[z].j2-g[z].j1+1,g[z].i2-g[z].i1+1));
        }
        else
        {
            dob(ot,n-2+g[z].i1-(g[z].j2-2)-2,st,min(g[z].j2-g[z].j1+1,g[z].i2-g[z].i1+1));
        }
        otg.push_back(ot);
    }
    return otg;
}
#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...