目录
一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
1592F1 - Alice and Recoloring 1
二、解题报告
1、思路分析
操作2、3可以被更低廉的操作1替代
一次操作4可以替代四次操作1,且更低廉
两次操作4 = 1次操作4 + 6次操作1,价格相同
也就是说, > 1 次的操作4我们都可以换成1次操作4加若干次操作1
那么我们全用操作1,然后看能不能替换掉4个操作1为1个操作4
只能替换一次,多了不会更便宜
2、复杂度
时间复杂度: O(NM)空间复杂度:O(NM)
3、代码详解
#include <bits/stdc++.h>
#include <ranges>
using i64 = long long;
using i32 = unsigned int;
using u64 = unsigned long long;
using i128 = __int128;
constexpr int inf32 = 1E9 + 7;
constexpr i64 inf64 = 1E18 + 7;
constexpr int P = 1'000'000'007;
void solve() {
int n, m;
std::cin >> n >> m;
std::vector<std::string> g(n);
for (int i = 0; i < n; ++ i)
std::cin >> g[i];
std::vector<std::vector<int>> acc(n + 1, std::vector<int>(m + 1));
int res = 0;
for (int i = n - 1; ~i; -- i)
for (int j = m - 1; ~j; -- j) {
acc[i][j] = acc[i + 1][j] ^ acc[i][j + 1] ^ acc[i + 1][j + 1];
if (acc[i][j] == (g[i][j] & 1)) {
g[i][j] = '#'; // 标记 操作1
acc[i][j] ^= 1;
++ res;
}
}
if (g[n - 1][m - 1] == '#') {
for (int i = 0; i < n - 1; ++ i)
for (int j = 0; j < m - 1; ++ j) {
if (g[i][j] == '#' && g[i][m - 1] == '#' && g[n - 1][j] == '#') {
-- res;
std::cout << res;
return;
}
}
}
std::cout << res;
}
auto FIO = []{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
int main () {
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int T = 1;
// std::cin >> T;
while (T --)
solve();
return 0;
}