답안 #421091

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
421091 2021-06-08T17:59:35 Z inwbear Furniture (JOI20_furniture) C++14
5 / 100
5000 ms 1744 KB
#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target ("sse4")
using namespace std;
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define MEM(x,a) memset((x),a,sizeof((x)))
#define F first
#define S second
#define imx INT_MAX
const long long MOD = (long long)(1e9+7);
const long long MMX = (long long)(1e18);
typedef long long LL;
typedef pair<int,int> pii;
int n,m,q,xi,xj,co[1005][1005][2],k,fur[1005][1005],mi,cp[1005][1005][2];
bool cc;
queue<pair<int,int> >qq;
int main()
{
    // freopen("in.txt","r",stdin);
    // freopen("out.txt","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&fur[i][j]);
        }
    }
    co[1][1][0]=1;
    co[n][m][1]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(fur[i][j]==1||co[i][j][0]==0)continue;
            if(fur[i+1][j]==0)co[i+1][j][0]++;
            if(fur[i][j+1]==0)co[i][j+1][0]++;
        }
    }
    for(int i=n;i>0;i--)
    {
        for(int j=m;j>0;j--)
        {
            if(fur[i][j]==1||co[i][j][1]==0)continue;
            if(fur[i-1][j]==0)co[i-1][j][1]++;
            if(fur[i][j-1]==0)co[i][j-1][1]++;
        }
    }
    scanf("%d",&q);
    while(q--)
    {
        cc=false;
        scanf("%d %d",&xi,&xj);
        for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cp[i][j][0]=0,cp[i][j][1]=0;
        cp[1][1][0]=1;
        cp[n][m][1]=1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(fur[i][j]==1||cp[i][j][0]==0)continue;
                if(fur[i+1][j]==0)cp[i+1][j][0]++;
                if(fur[i][j+1]==0)cp[i][j+1][0]++;
            }
        }
        for(int i=n;i>0;i--)
        {
            for(int j=m;j>0;j--)
            {
                if(fur[i][j]==1||cp[i][j][1]==0)continue;
                if(fur[i-1][j]==0)cp[i-1][j][1]++;
                if(fur[i][j-1]==0)cp[i][j-1][1]++;
            }
        }
        // printf("-------------------\n");
        // for(int i=1;i<=n;i++)
        // {
        //     for(int j=1;j<=m;j++)
        //     {
        //         //if(co[i][j][0]!=cp[i][j][0])printf("%d %d\n",i,j);
        //         //if(co[i][j][1]!=cp[i][j][1])printf("%d %d\n",i,j);
        //         printf("[%d %d %d %d] ",co[i][j][0],cp[i][j][0],co[i][j][1],cp[i][j][1]);
        //     }
        //     printf("\n");
        // }
        mi=1;
        for(int i=xi-1;i>0;i--)
        {
            if(fur[i][xj]==1)mi=0;
            if(co[i][xj][0]>0&&co[i][xj][1]-mi>0)
            {
                cc=true;
                break;
            }
        }
        mi=1;
        if(!cc)
        for(int j=xj-1;j>0;j--)
        {
            if(fur[xi][j]==1)mi=0;
            if(co[xi][j][0]>0&&co[xi][j][1]-mi>0)
            {
                cc=true;
                break;
            }
        }
        mi=1;
        if(!cc)
        for(int i=xi+1;i<=n;i++)
        {
            if(fur[i][xj]==1)mi=0;
            if(co[i][xj][0]-mi>0&&co[i][xj][1]>0)
            {
                cc=true;
                break;
            }
        }
        mi=1;
        if(!cc)
        for(int j=xj+1;j<=m;j++)
        {
            if(fur[xi][j]==1)mi=0;
            if(co[xi][j][0]-mi>0&&co[xi][j][1]>0)
            {
                cc=true;
                break;
            }
        }
        if(cc)
        {
            printf("1\n");
            fur[xi][xj]=1;
            if(co[xi][xj][0]>0)
            {
                co[xi][xj][0]=0;
                qq.push({xi,xj});
                while(!qq.empty())
                {
                    if(qq.front().F+1<=n)
                    {
                        co[qq.front().F+1][qq.front().S][0]--;
                        if(co[qq.front().F+1][qq.front().S][0]==0)
                        {
                            qq.push({qq.front().F+1,qq.front().S});
                        }
                    }
                    if(qq.front().S+1<=m)
                    {
                        co[qq.front().F][qq.front().S+1][0]--;
                        if(co[qq.front().F][qq.front().S+1][0]==0)
                        {
                            qq.push({qq.front().F,qq.front().S+1});
                        }
                    }
                    qq.pop();
                }
            }
            if(co[xi][xj][1]>0)
            {
                co[xi][xj][1]=0;
                qq.push({xi,xj});
                while(!qq.empty())
                {
                    if(qq.front().F-1>0)
                    {
                        co[qq.front().F-1][qq.front().S][1]--;
                        if(co[qq.front().F-1][qq.front().S][1]==0)
                        {
                            qq.push({qq.front().F-1,qq.front().S});
                        }
                    }
                    if(qq.front().S-1>0)
                    {
                        co[qq.front().F][qq.front().S-1][1]--;
                        if(co[qq.front().F][qq.front().S-1][1]==0)
                        {
                            qq.push({qq.front().F,qq.front().S-1});
                        }
                    }
                    qq.pop();
                }
            }
        }
        else printf("0\n");
    }
}

Compilation message

furniture.cpp: In function 'int main()':
furniture.cpp:22:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   22 |     scanf("%d %d",&n,&m);
      |     ~~~~~^~~~~~~~~~~~~~~
furniture.cpp:27:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   27 |             scanf("%d",&fur[i][j]);
      |             ~~~~~^~~~~~~~~~~~~~~~~
furniture.cpp:50:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |     scanf("%d",&q);
      |     ~~~~~^~~~~~~~~
furniture.cpp:54:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   54 |         scanf("%d %d",&xi,&xj);
      |         ~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 1228 KB Output is correct
2 Correct 137 ms 1560 KB Output is correct
3 Correct 335 ms 1516 KB Output is correct
4 Correct 647 ms 1584 KB Output is correct
5 Correct 709 ms 1744 KB Output is correct
6 Correct 890 ms 1680 KB Output is correct
7 Correct 572 ms 1736 KB Output is correct
8 Correct 417 ms 1612 KB Output is correct
9 Correct 459 ms 1612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 1228 KB Output is correct
2 Correct 137 ms 1560 KB Output is correct
3 Correct 335 ms 1516 KB Output is correct
4 Correct 647 ms 1584 KB Output is correct
5 Correct 709 ms 1744 KB Output is correct
6 Correct 890 ms 1680 KB Output is correct
7 Correct 572 ms 1736 KB Output is correct
8 Correct 417 ms 1612 KB Output is correct
9 Correct 459 ms 1612 KB Output is correct
10 Execution timed out 5044 ms 1660 KB Time limit exceeded
11 Halted 0 ms 0 KB -