80pts TLE求调(不是加前缀和还T
查看原帖
80pts TLE求调(不是加前缀和还T
1036180
ChampionCyan楼主2025/7/13 11:55
#include <bits/stdc++.h>
#define int long long
#define mod(a) ((a) % 998244353ll)
using namespace std;
const int MAXN = 1005;

bitset<MAXN> a[MAXN];
int x[MAXN][MAXN], y[MAXN][MAXN];

inline void solve() {
    int ansc = 0, ansf = 0, n, m, c, f;
    cin >> n >> m >> c >> f;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            char ch;
            cin >> ch;
            a[i][j] = (bool)(ch - '0');
        }
    for (int i = 0; i <= n + 1; i++)
        for (int j = 0; j <= m + 1; j++)
            x[i][j] = y[i][j] = 0;
    for (int i = n; i >= 1; i--)
        for (int j = m; j >= 1; j--)
            if (!a[i][j])
                x[i][j] = x[i + 1][j] + 1, y[i][j] = y[i][j + 1] + 1;
    /*for (int i = 1; i <= n; cout << '\n', i++)
        for (int j = 1; j <= m; j++)
            cout << x[i][j] << ' ';
    cout << '\n';
    for (int i = 1; i <= n; cout << '\n', i++)
        for (int j = 1; j <= m; j++)
            cout << y[i][j] << ' ';
    cout << '\n';*/
    for (int i = 1; i < n - 1; i++)
        for (int j = 1; j < m; j++) {
            if (a[i][j] || a[i][j + 1] || a[i + 1][j] || a[i + 2][j])
                continue;
            int y1 = y[i][j] - 1, y2, x1 = x[i][j] - 1, x2;
            for (x2 = i + 2; x2 <= i + x1; x2++) {
                if (a[x2][j + 1])
                    continue;
                y2 = y[x2][j] - 1;
                ansc = mod(ansc + mod(y1 * y2));
                ansf = mod(ansf + mod(y1 * y2 * (i + x1 - x2)));
            }
        }
    cout << mod(ansc * c) << ' ' << mod(ansf * f) << '\n';
}

signed main() {
    cin.tie(0) -> sync_with_stdio(0);
    int t, id;
    cin >> t >> id;
    while (t--)
        solve();
    return 0;
}
2025/7/13 11:55
加载中...