私は最近、IOI 2010 の 1 日目のタスク 3 「生活の質」から直接取得して翻訳したこの問題を実行していて、奇妙な現象に遭遇しました。
私は 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];
}
}
完全なACを取得しました(受け入れられました)。
ここの4枚の写真からわかるように:
TLE の結果、画像 1 : https://i.stack.imgur.com/9o5C2.png
TLE の結果、画像 2 : https://i.stack.imgur.com/TJwX5.png
AC 結果、写真 1 : https://i.stack.imgur.com/1fo2H.png
AC 結果、画像 2 : https://i.stack.imgur.com/CSsZ2.png
2 つの for ループのコードは一般に (受け入れられたテスト ケースでも) 少し速く実行され、単一の for ループの方が速いはずであるという私の論理とは対照的です。なぜこれが起こったのですか?
完全なコード (AC) : https://pastebin.com/c7at11Hausing namespace std;
(これは競争力のあるプログラミング コンテストであるため、意味のないビットや のようなものはすべて無視してください)。
- 注意 : ジャッジ サーバーlqdoj.edu.vnは、グローバルな競技プログラミング コンテスト プラットフォームであるdmoj.ca上に構築されています。