10分求条
查看原帖
10分求条
541523
__CuSO4__楼主2025/7/25 10:29

民间数据T两个点,官方数据只过了前四个。

#include <iostream>
#define mod 998244353ll
using namespace std;

int T, id;
long long n, m, c, f;
long long a[1005][1005], s1[1005][1005], t[1005][1005], tt[1005][1005];
long long s2[1005][1005];

void init()
{
    scanf("%d%d%d%d", &n, &m, &c, &f);
    for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
    {
        t[i][j] = a[i][j] = s1[i][j] = s2[i][j] = tt[i][j] = 0;
    }
    for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
    {
        scanf("%1d",&a[i][j]);
        s1[i][j] = s1[i-1][j]+s1[i][j-1]-s1[i-1][j-1]+a[i][j];
        t[i][j] = 0;
    }
    for (int i = 1; i <= n; i++)
        for (int j = m; j >= 1; j--)
            if (a[i][j] == 0) t[i][j] = t[i][j+1] + 1;
    for (int j = 1; j <= m; j++)
    for (int i = n; i >= 1; i--)
            if (a[i][j] == 0) tt[i][j] = tt[i+1][j] + 1;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            s2[i][j] = (s2[i-1][j]+s2[i][j-1]-s2[i-1][j-1]+max(0ll,t[i][j]-1)+mod)%mod;
}
long long gs(long long s[1005][1005], int x1, int y1, int x2, int y2)
{
    return (s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]+mod)%mod;
}
void print()
{
	puts("a:");
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++) printf("%3d", a[i][j]);
		puts("");
	}
	puts("t:");
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++) printf("%3d", t[i][j]);
		puts("");
	}
	puts("tt:");
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++) printf("%3d", tt[i][j]);
		puts("");
	}
	puts("s2:");
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++) printf("%3d", s2[i][j]);
		puts("");
	}
}


int main()
{
    scanf("%d%d", &T, &id);
    while (T--)
    {
        init();
        print();
        long long ans1 = 0, ans2 = 0;
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                if (a[i][j] || t[i][j] == 1) continue;
                if (i+2 <= i+tt[i][j]-1)
                    ans1 = (ans1 + gs(s2, i+2, j, i+tt[i][j]-1, j)*(t[i][j]-1)%mod) % mod;
                if (i+2 <= i+tt[i][j]-2)
                {
//                    ans2 = (ans2 + gs(s2, i+2, j, i+tt[i][j]-2, j)*(t[i][j]-1)%mod) % mod;
	                for (int k = i + 3; k <= i+tt[i][j]-1; k++)
	                {
	                	ans2 = (ans2 + gs(s2, i+2, j, k-1, j)*(t[i][j]-1)%mod) % mod;
					}
				}
//                printf("(%d,%d)->(%d, %d): %d\n",i, j, i+2, i+tt[i][j]-1, gs(s2, i+2, j, i+tt[i][j]-1, j));
//                printf("%d %d\n", gs(s2, i, j+2, i, j+tt[i][j]-1), gs(s2, i, j+2, i, j+tt[i][j]-2));
            }
        }
        printf("%lld %lld\n", ans1*c%mod, ans2*f%mod);
    }
    return 0;
}
2025/7/25 10:29
加载中...