调了好久第16个点一直过不去(别的点都过了)
查看原帖
调了好久第16个点一直过不去(别的点都过了)
1262132
wangchengye378269楼主2024/11/19 19:52
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
const int M = 998244353;
bool a[N][N];
int n,m,c,f;//1<=n,m<=1000 0<=c,f<=1
int bl1[N][N],bl2[N][N],bl3[N][N];
void work1()
{
    memset(bl1,0,sizeof bl1);
    memset(bl2,0,sizeof bl2);
    memset(bl3,0,sizeof bl3);
    for (int i = 1; i <= n; i++)
        for (int j = m; j >= 1; j--)
            if (a[i][j] == 0)
            {
                bl1[i][j] = bl1[i][j + 1];
                if (j + 1 <= m && a[i][j + 1] == 0) bl1[i][j]++;
            }
    for (int j = 1; j <= m; j++)
        for (int i = n; i >= 1; i--)
            if (a[i][j] == 0)
            {
                bl2[i][j] = bl1[i][j];
                bl2[i][j] += bl2[i + 1][j];
            }
    for (int j = 1; j <= m; j++)
        for (int i = n; i >= 1; i--)
            if (a[i][j] == 0)
            {
                bl3[i][j] = bl3[i + 1][j];
                if (i + 1 <= n && a[i + 1][j] == 0) bl3[i][j]++;
            }
}
void work2()
{
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            bl3[i][j] *= bl1[i][j];
        }
    for (int j = 1; j <= m; j++)
        for (int i = n; i >= 1; i--)
        {
            bl2[i][j] = bl3[i][j];
            if (a[i + 1][j] == 0) bl2[i][j] += bl2[i + 1][j];
        }
}
int main ()//36 18
{

    int T,id;//1<=T<=5
    scanf("%d%d",&T,&id);
    while (T--)
    {
        scanf("%d%d%d%d",&n,&m,&c,&f);
        memset(a,0,sizeof a);
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
            {
                char ch;
                scanf(" %c",&ch);
                a[i][j] = ch - '0';
            }
        int ansc = 0,ansf = 0;
        work1();
        if (c != 0)//1e6
        {
            for (int i = 1; i <= n; i++)
                for (int j = 1;j <= m; j++)
                {
                    if (a[i + 1][j] == 0 && a[i + 2][j] == 0)ansc += bl1[i][j] * bl2[i + 2][j];
                    ansc %= M;
                }
        }
        if (f != 0)
        {
            work2();
            for (int i = 1; i <= n; i++)
                for (int j = 1;j <= m; j++)
                {
                    if (a[i + 1][j] == 0 && a[i + 2][j] == 0)ansf += bl1[i][j] * bl2[i + 2][j];
                    ansf %= M;
                }
        }
        printf("%d %d\n",ansc,ansf);
    }
    return 0;
}

2024/11/19 19:52
加载中...