【发布时间】:2021-12-07 12:32:21
【问题描述】:
我最近在做this problem,直接从IOI 2010的第1天任务3翻译过来的,"Quality of life",遇到了一个奇怪的现象。
我正在设置一个 0-1 矩阵并使用它在 1 个循环中计算前缀和矩阵:
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (a[i][j] < x) {lower[i][j] = 0;} else {lower[i][j] = 1;}
b[i][j] = b[i-1][j] + b[i][j-1] - b[i-1][j-1] + lower[i][j];
}
}
我在 4 次测试中获得了 TLE(超出时间限制)(时间限制为 2.0 秒)。分别使用2个for循环时:
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (a[i][j] < x) {lower[i][j] = 0;} else {lower[i][j] = 1;}
}
}
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
b[i][j] = b[i-1][j] + b[i][j-1] - b[i-1][j-1] + lower[i][j];
}
}
让我获得完整的交流电(接受)。
我们可以从这里的 4 张图片中看到:
-
TLE 结果,图一:https://i.stack.imgur.com/9o5C2.png
-
TLE 结果,图 2:https://i.stack.imgur.com/TJwX5.png
2 个 for 循环代码通常运行得更快一些(即使在已接受的测试用例中),这与我认为单个 for 循环应该更快的逻辑形成鲜明对比。为什么会这样?
完整代码(AC):https://pastebin.com/c7at11Ha(请忽略所有废话和using namespace std;之类的东西,因为这是一场竞争性编程竞赛)。
- 注意:评委服务器lqdoj.edu.vn 建立在全球竞争性编程竞赛平台dmoj.ca 之上。
【问题讨论】:
-
您真的需要存储
lower以供以后使用吗?为什么不直接添加int(a[i][j] >= x)? -
@Brannon 不是真的,说实话...哎呀。
标签: c++ performance for-loop prefix-sum