답안 #885650

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
885650 2023-12-10T11:23:59 Z alexdd Bomb (IZhO17_bomb) C++17
51 / 100
1000 ms 58052 KB
#include<iostream>
#pragma GCC optimize("O3,unroll-loops")
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;
}
void solve_bulaneala(int minx, int miny)
{
    int mxm=0,prec=1;
    for(int i=miny;i>max(0,minx-3);i--)
    {
        if(i*minx <= mxm)
            break;
        int st,dr,mij,ans=0;
        st=max(prec, (mxm-1)/i+1);
        dr=minx;
        if(!verif(st,i))
            continue;
        while(st<=dr)
        {
            mij=(st+dr)/2;
            if(verif(mij,i))
            {
                ans = max(ans, mij);
                st=mij+1;
            }
            else
            {
                dr=mij-1;
            }
        }
        mxm = max(mxm, i*ans);
        prec=ans;
    }
    prec=1;
    for(int i=minx;i>max(0,minx-3);i--)
    {
        if(i*miny <= mxm)
            break;
        int st,dr,mij,ans=0;
        st=max(prec, (mxm-1)/i+1);
        dr=miny;
        if(!verif(st,i))
            continue;
        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;
    }
    cout<<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)
    {
        solve_bulaneala(minx,miny);
        return 0;
    }
    else
    {
        cout<<minx*miny;
        return 0;
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4440 KB Output is correct
2 Correct 1 ms 4440 KB Output is correct
3 Correct 9 ms 42840 KB Output is correct
4 Correct 9 ms 42844 KB Output is correct
5 Correct 1 ms 4564 KB Output is correct
6 Correct 1 ms 4444 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 1 ms 4444 KB Output is correct
10 Correct 1 ms 4444 KB Output is correct
11 Correct 1 ms 4444 KB Output is correct
12 Correct 1 ms 4444 KB Output is correct
13 Correct 1 ms 4444 KB Output is correct
14 Correct 1 ms 4444 KB Output is correct
15 Correct 1 ms 4444 KB Output is correct
16 Correct 1 ms 4444 KB Output is correct
17 Correct 1 ms 6748 KB Output is correct
18 Correct 2 ms 6748 KB Output is correct
19 Correct 2 ms 7004 KB Output is correct
20 Correct 2 ms 6880 KB Output is correct
21 Correct 1 ms 6748 KB Output is correct
22 Correct 2 ms 6748 KB Output is correct
23 Correct 2 ms 7004 KB Output is correct
24 Correct 1 ms 7004 KB Output is correct
25 Correct 2 ms 7000 KB Output is correct
26 Correct 2 ms 7004 KB Output is correct
27 Correct 5 ms 12188 KB Output is correct
28 Correct 7 ms 12120 KB Output is correct
29 Incorrect 29 ms 12760 KB Output isn't correct
30 Correct 45 ms 13404 KB Output is correct
31 Correct 32 ms 12844 KB Output is correct
32 Correct 40 ms 13236 KB Output is correct
33 Correct 111 ms 15956 KB Output is correct
34 Correct 6 ms 12380 KB Output is correct
35 Correct 45 ms 15192 KB Output is correct
36 Correct 24 ms 15196 KB Output is correct
37 Correct 1 ms 4444 KB Output is correct
38 Correct 257 ms 57364 KB Output is correct
39 Correct 1 ms 4444 KB Output is correct
40 Correct 55 ms 25684 KB Output is correct
41 Correct 1 ms 4440 KB Output is correct
42 Correct 2 ms 7004 KB Output is correct
43 Correct 379 ms 57312 KB Output is correct
44 Correct 81 ms 15948 KB Output is correct
45 Incorrect 505 ms 57316 KB Output isn't correct
46 Correct 720 ms 57432 KB Output is correct
47 Incorrect 826 ms 57844 KB Output isn't correct
48 Execution timed out 1073 ms 57768 KB Time limit exceeded
49 Correct 284 ms 57444 KB Output is correct
50 Execution timed out 1076 ms 57568 KB Time limit exceeded
51 Execution timed out 1058 ms 57696 KB Time limit exceeded
52 Execution timed out 1064 ms 57428 KB Time limit exceeded
53 Execution timed out 1034 ms 57424 KB Time limit exceeded
54 Execution timed out 1092 ms 57572 KB Time limit exceeded
55 Execution timed out 1050 ms 57680 KB Time limit exceeded
56 Incorrect 228 ms 57428 KB Output isn't correct
57 Execution timed out 1102 ms 57732 KB Time limit exceeded
58 Execution timed out 1030 ms 57396 KB Time limit exceeded
59 Execution timed out 1052 ms 57308 KB Time limit exceeded
60 Correct 344 ms 57424 KB Output is correct
61 Correct 608 ms 57936 KB Output is correct
62 Incorrect 240 ms 57428 KB Output isn't correct
63 Correct 321 ms 57424 KB Output is correct
64 Correct 381 ms 57472 KB Output is correct
65 Incorrect 460 ms 57744 KB Output isn't correct
66 Correct 393 ms 57428 KB Output is correct
67 Execution timed out 1052 ms 57540 KB Time limit exceeded
68 Execution timed out 1037 ms 57556 KB Time limit exceeded
69 Execution timed out 1062 ms 57516 KB Time limit exceeded
70 Incorrect 139 ms 50172 KB Output isn't correct
71 Incorrect 217 ms 57424 KB Output isn't correct
72 Execution timed out 1020 ms 57472 KB Time limit exceeded
73 Execution timed out 1014 ms 57424 KB Time limit exceeded
74 Execution timed out 1058 ms 57324 KB Time limit exceeded
75 Execution timed out 1054 ms 57684 KB Time limit exceeded
76 Incorrect 813 ms 57428 KB Output isn't correct
77 Incorrect 439 ms 57572 KB Output isn't correct
78 Incorrect 482 ms 57316 KB Output isn't correct
79 Execution timed out 1056 ms 57956 KB Time limit exceeded
80 Execution timed out 1097 ms 58052 KB Time limit exceeded
81 Incorrect 542 ms 57308 KB Output isn't correct
82 Incorrect 391 ms 57424 KB Output isn't correct
83 Incorrect 218 ms 57424 KB Output isn't correct
84 Execution timed out 1016 ms 57368 KB Time limit exceeded
85 Incorrect 351 ms 57336 KB Output isn't correct
86 Correct 374 ms 57324 KB Output is correct
87 Execution timed out 1041 ms 57560 KB Time limit exceeded
88 Incorrect 245 ms 57320 KB Output isn't correct
89 Incorrect 644 ms 57472 KB Output isn't correct
90 Incorrect 291 ms 50436 KB Output isn't correct
91 Incorrect 569 ms 57680 KB Output isn't correct
92 Incorrect 219 ms 57268 KB Output isn't correct
93 Incorrect 223 ms 57208 KB Output isn't correct
94 Incorrect 563 ms 57432 KB Output isn't correct
95 Incorrect 223 ms 57424 KB Output isn't correct
96 Incorrect 217 ms 57424 KB Output isn't correct
97 Incorrect 309 ms 57324 KB Output isn't correct
98 Incorrect 225 ms 57568 KB Output isn't correct
99 Incorrect 523 ms 57476 KB Output isn't correct
100 Incorrect 267 ms 57656 KB Output isn't correct