暑期训练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); }