1

私は最近、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枚の写真からわかるように:

2 つの for ループのコードは一般に (受け入れられたテスト ケースでも) 少し速く実行され、単一の for ループの方が速いはずであるという私の論理とは対照的です。なぜこれが起こったのですか?

完全なコード (AC) : https://pastebin.com/c7at11Hausing namespace std; (これは競争力のあるプログラミング コンテストであるため、意味のないビットや のようなものはすべて無視してください)。

  • 注意 : ジャッジ サーバーlqdoj.edu.vnは、グローバルな競技プログラミング コンテスト プラットフォームであるdmoj.ca上に構築されています。
4

1 に答える 1