P6070 『MdOI R1』Decrease
P6070 『MdOI R1』Decrease
题目
给定一个
每次操作,你可以将一个
初始时,矩阵中有
请你求出至少需要多少次操作,可以将矩形中所有数都变为
输入
第一行三个整数
接下来
输出
一行一个整数,表示最少操作次数。
特别地,如果无法使矩阵中所有数都变为 -1
。
样例 #1
输入
4 14 3
1 1 1
1 2 1
1 3 1
2 1 1
2 2 3
2 3 3
2 4 2
3 1 1
3 2 3
3 3 3
3 4 2
4 2 2
4 3 2
4 4 2
输出
3
样例 #2
输入
3 1 2
1 1 1
输出
-1
样例 #3
输入
4 5 1
1 1 5
2 2 -3
2 3 -4
3 3 1
4 4 2
输出
15
提示
【样例 1 解释】:
给出的矩阵为:
1 1 1 0
1 3 3 2
1 3 3 2
0 2 2 2
具体步骤:
先将以第一行第一列为左上角的连续子矩阵执行 减 1 操作 一次;
再将以第二行第二列为左上角的连续子矩阵执行 减 1 操作 两次。
总共三次。
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 3 3 2 0 2 2 2 0 1 1 1 0 0 0 0
1 3 3 2 0 2 2 2 0 1 1 1 0 0 0 0
0 2 2 2 0 2 2 2 0 1 1 1 0 0 0 0
【样例 2 解释】:
给出的矩阵为:
1 0 0
0 0 0
0 0 0
只通过
【数据范围】
本题采用捆绑测试。
子任务编号 | 分值 | ||
---|---|---|---|
1 | 11 | ||
2 | 14 | ||
3 | 17 | ||
4 | 34 | ||
5 | 24 |
对于所有数据,
数据保证如果有解,答案不超过
【提示】
本题读入量较大,建议使用较快的读入方式。
思路
分析数据范围,时间复杂度为
代码
#include <bits/stdc++.h>
using namespace std;
int n, m, k, x, y, z, a[5010][5010], cf[5010][5010];
long long ans;
int main()
{
scanf("%d %d %d", &n, &m, &k);
while (m -- )
{
scanf("%d %d %d", &x, &y, &z);
a[x][y] = z;
}
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= n; j ++ )
cf[i][j] = a[i][j] - a[i - 1][j] - a[i][j - 1] + a[i - 1][j - 1];
}
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= n; j ++ )
{
ans += abs(cf[i][j]); // 记得加绝对值
if (i + k <= n + 1 && j + k <= n + 1)
{
cf[i + k][j] += cf[i][j];
cf[i][j + k] += cf[i][j];
cf[i + k][j + k] -= cf[i][j];
cf[i][j] -= cf[i][j]; // 注意:放在循环最后
}
}
}
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= n; j ++ )
{
if (cf[i][j] != 0)
{
puts("-1");
return 0;
}
}
}
printf("%lld", ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】