結果

問題 No.3054 Modulo Inequalities
ユーザー rin204
提出日時 2025-02-05 20:36:53
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 501 ms / 2,500 ms
コード長 1,287 bytes
コンパイル時間 12,118 ms
コンパイル使用メモリ 353,104 KB
実行使用メモリ 48,504 KB
最終ジャッジ日時 2025-02-05 20:38:12
合計ジャッジ時間 22,261 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 31
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

#include "testlib.h"

void solve() {
    int n = inf.readInt(1, 500000);
    inf.readEoln();
    const int m = 1000010;
    std::vector<int> cnt(2 * m + 1, 0);
    for (int i = 0; i < n; i++) {
        int a = inf.readInt(1, 1000000);
        inf.readSpace();
        int b = inf.readInt(1, 1000000);
        inf.readEoln();

        cnt[a + m]--;
        cnt[b + m]++;
        cnt[b - a - 1 + m]--;
    }

    std::vector<int> cum(2 * m + 1, 0);
    for (int i = 1; i <= 2 * m; i++) {
        cum[i] = cum[i - 1] + cnt[i];
    }

    int min_ = n + 1;
    int idx  = -1;
    for (int i = 1; i < m; i++) {
        int ge = 0;
        for (int t = 0; t * i < m; t++) {
            int l = t * i;
            int r = std::min(m, l + i);
            ge += (cum[r - 1 + m] - cum[l - 1 + m]) * t;
        }
        for (int t = 0; t * i > -m; t--) {
            int r = t * i;
            int l = std::max(-m + 1, r - i);
            ge += (cum[r - 1 + m] - cum[l - 1 + m]) * (t - 1);
        }

        if (ge < min_) {
            min_ = ge;
            idx  = i;
        }
    }
    std::cout << idx << std::endl;
}

int main(int argc, char *argv[]) {
    std::cin.tie(0)->sync_with_stdio(0);
    registerValidation(argc, argv);
    solve();
    inf.readEof();
}
0