Submission #885646

#TimeUsernameProblemLanguageResultExecution timeMemory
885646alexddBomb (IZhO17_bomb)C++17
49 / 100
1093 ms58000 KiB
#include<iostream>
using namespace std;
int n,m;
char mat[2505][2505];
int sump[2505][2505];
int mars[2505][2505];
int pver[2505][2505];
bool verif(int cntx, int cnty)
{
    if(pver[cntx][cnty]!=0)
    {
        if(pver[cntx][cnty]==-1)
            return 0;
        else
            return 1;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            mars[i][j]=0;
    for(int i=1;i+cntx-1<=n;i++)
    {
        for(int j=1;j+cnty-1<=m;j++)
        {
            if(sump[i+cntx-1][j+cnty-1] - sump[i+cntx-1][j-1] - sump[i-1][j+cnty-1] + sump[i-1][j-1] == cntx*cnty)///toate is 1
            {
                mars[i][j]++;
                mars[i][j+cnty]--;
                mars[i+cntx][j]--;
                mars[i+cntx][j+cnty]++;
            }
            mars[i][j] += mars[i-1][j] + mars[i][j-1] - mars[i-1][j-1];
            if(mars[i][j]==0 && mat[i][j]=='1')
            {
                pver[cntx][cnty]=-1;
                return 0;
            }
        }
    }
    pver[cntx][cnty]=1;
    return 1;
}
void solve_n3_y(int minx, int miny)
{
    int poz=0, mxm=0;
    for(int i=minx;i>0;i--)
    {
        if(i*miny <= mxm)
            break;
        poz = max(poz, (mxm-1)/i+1);
        while(poz+1<=miny && verif(i,poz+1))
        {
            poz++;
        }
        if(verif(i,poz)) mxm = max(mxm, i*poz);
    }
    cout<<mxm;
}
void solve_n3_x(int minx, int miny)
{
    int poz=0, mxm=0;
    for(int i=miny;i>0;i--)
    {
        if(i*minx <= mxm)
            break;
        poz = max(poz, (mxm-1)/i+1);
        while(poz+1<=minx && verif(poz+1,i))
        {
            poz++;
        }
        if(verif(poz,i)) mxm = max(mxm, i*poz);
    }
    cout<<mxm;
}
int calcmax_x(int i, int st, int dr)
{
    int mij,ans=0;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(verif(mij,i))
        {
            ans = max(ans, mij);
            st=mij+1;
        }
        else
        {
            dr=mij-1;
        }
    }
    return ans;
}
int solve_bulaneala(int minx, int miny)
{
    return 0;
    int mxm=0,prec=1;
    for(int i=miny;i>max(0,miny-3);i--)
    {
        if(i*minx <= mxm)
            break;
        int st,dr,mij,ans=0;
        st=max(prec, (mxm-1)/i+1);
        dr=minx;
        mxm = max(mxm, i*calcmax_x(i,st,dr));
        prec=ans;
    }
    prec=1;
    for(int i=minx;i>0;i--)
    {
        if(i*miny <= mxm)
            break;
        int st,dr,mij,ans=0;
        st=max(prec, (mxm-1)/i+1);
        dr=miny;
        while(st<=dr)
        {
            mij=(st+dr)/2;
            if(verif(i,mij))
            {
                ans = max(ans, mij);
                st=mij+1;
            }
            else
            {
                dr=mij-1;
            }
        }
        mxm = max(mxm, i*ans);
        prec=ans;
    }
    return mxm;
}
int solve_cautare_ternara(int minx, int miny)
{
    int st,dr;
    st=1;
    dr=miny;
    while(dr-st+1>3)
    {
        int mij1 = st + (dr-st+1)/3;
        int mij2 = mij1 + (dr-st+1)/3;
        if(calcmax_x(mij1,1,minx)*mij1 > calcmax_x(mij2,1,minx)*mij2)
        {
            dr=mij2;
        }
        else
        {
            st=mij1;
        }
    }
    int mxm=0;
    for(int i=st;i<=dr;i++)
        mxm = max(mxm, calcmax_x(i,1,minx)*i);
    return mxm;
}
signed main()
{
    cin>>n>>m;
    int minx=n,miny=m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>mat[i][j];
            sump[i][j] = sump[i-1][j] + sump[i][j-1] - sump[i-1][j-1];
            if(mat[i][j]=='1')
                sump[i][j]++;
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(mat[i][j]=='1' && (j==m || mat[i][j+1]=='0'))
            {
                int cnt=0;
                for(int u=j;u>0;u--)
                {
                    if(mat[i][u]=='0')
                        break;
                    cnt++;
                }
                miny = min(miny, cnt);
            }
        }
    }
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(mat[j][i]=='1' && (j==n || mat[j+1][i]=='0'))
            {
                int cnt=0;
                for(int u=j;u>0;u--)
                {
                    if(mat[u][i]=='0')
                        break;
                    cnt++;
                }
                minx = min(minx, cnt);
            }
        }
    }
    if(1LL*miny * n * m <= 170000000)
    {
        solve_n3_y(minx,miny);
        return 0;
    }
    else if(1LL*minx*n*m <= 170000000)
    {
        solve_n3_x(minx,miny);
        return 0;
    }
    else if(1)
    {
        cout<<max(solve_bulaneala(minx,miny), solve_cautare_ternara(minx,miny));
        return 0;
    }
    else
    {
        cout<<minx*miny;
        return 0;
    }
    return 0;
}

Compilation message (stderr)

bomb.cpp: In function 'int solve_bulaneala(int, int)':
bomb.cpp:100:19: warning: unused variable 'mij' [-Wunused-variable]
  100 |         int st,dr,mij,ans=0;
      |                   ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...