Loading

暑期训练2 Gym - 102623H Hay Mower 思维

给一个n * m 的草地,初始时刻没有草,每单位时刻每块会长草。

在t时刻,将在第 x 行或者第 y 列锄草。

问最终共锄了多少草。

暴力方法:

标记pre[maxn][maxn],表示这个点上次的锄草时间,每次锄草都遍历当前行/列,并且标记pre。在线更新res

复杂度k*n

优化方法:

标记l[maxn],r[maxn].表示该行最后的最后的锄草时间,最后根据最后时间统计贡献即可。正确性是显然的,一旦一块地被锄草,到这时刻为止所有草都会被锄。

ll a[505][505];
ll prec[505];
ll prer[505];



int main() {
    ll res = 0;
    int n, m, k;
    n = readint();
    m = readint();
    k = readint();
    char op[5];
    for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) a[i][j] = readll(), a[i][j] %= MOD;
    for (int i = 0; i < k; i++) {
        scanf("%s", op);
        ll x = readll();
        ll y = readll();
        if (op[0] == 'r') prer[x] = max(y, prer[x]);
        else prec[x] = max(y, prec[x]);
    }
    for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) res += a[i][j] * (max(prer[i], prec[j]) % MOD), res %= MOD;
    Put(res);
}

 

posted @ 2020-08-19 19:44  MQFLLY  阅读(195)  评论(0编辑  收藏  举报