Submission #1232647

#TimeUsernameProblemLanguageResultExecution timeMemory
1232647Muhammad_AneeqMosaic (IOI24_mosaic)C++20
20 / 100
237 ms33596 KiB
#include "mosaic.h"

#include <vector>
#include <algorithm>
#include <set>
#include <iostream>
using namespace std;
set<int>st;
int gt(vector<int>x,vector<int>y)
{
    int n=x.size();
    int gr[n][n]={};
    for (int i=0;i<n;i++)
    {
        gr[0][i]=x[i];
        gr[i][0]=y[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;
            else
                gr[i][j]=0;
        }
    }
    set<int>s;
    for (int i=1;i<n;i++)
    {
        for (int j=1;j<n;j++)
        {
            if (gr[i][j]==1&&s.find(j-i)==s.end())
            {
                s.insert(j-i);
            }
        }
    }
    return s.size();
}
void mk(vector<int>x,vector<int>y)
{
    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;
        }
    }
    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;
        }
    }
}
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();
    int prex[n+1]={},prey[n+1]={};
    for (int i=0;i<n;i++)
    {
        prex[i+1]=prex[i]+X[i];
        prey[i+1]=prey[i]+Y[i];
    }
    if (prex[n]==0&&prey[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;
    }
    mk(X,Y);
    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]==0&&L[i]==0)
        {
            sm=prex[R[i]+1]-prex[L[i]]+prey[B[i]+1]-prey[T[i]]-X[0];
            T[i]++;
            L[i]++;
        }
        else if (T[i]==0)
        {
            sm=prex[R[i]+1]-prex[L[i]];
            T[i]++;
        }
        else if (L[i]==0)
        {
            sm=prey[B[i]+1]-prey[T[i]];
            L[i]++;
        }
        for (int j=T[i];j<=B[i];j++)
        {
            for (int k=L[i];k<=R[i];k++)
            {
                if (st.find(k-j)!=st.end())
                    sm++;
            }
        }
        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...