結果

問題 No.3677 Global Checksum
コンテスト
ユーザー 秋ナス🍆
提出日時 2026-09-05 09:58:04
言語 C++23(gcc16)
(gcc 16.1.0 + boost 1.92.0)
コンパイル:
g++-16 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
TLE  
実行時間 -
コード長 2,477 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,192 ms
コンパイル使用メモリ 176,984 KB
実行使用メモリ 29,668 KB
最終ジャッジ日時 2026-09-05 09:58:14
合計ジャッジ時間 5,992 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge4_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 12 TLE * 1 -- * 7
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <iostream>
#include <vector>
#include <cstdint>
#include <cstdio>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

int main() {
    // 入力データの取得(mmapを優先し、不可ならfreadへフォールバック)
    struct stat st;
    const char* ptr = nullptr;
    std::vector<char> in_buf;

    if (fstat(STDIN_FILENO, &st) == 0 && st.st_size > 0) {
        void* addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, STDIN_FILENO, 0);
        if (addr != MAP_FAILED) {
            ptr = static_cast<const char*>(addr);
        }
    }

    if (!ptr) {
        constexpr size_t BUF_SIZE = 64 * 1024 * 1024; // 64MB
        in_buf.resize(BUF_SIZE);
        size_t size = fread(in_buf.data(), 1, BUF_SIZE, stdin);
        in_buf[size] = '\0';
        ptr = in_buf.data();
    }

    // ポインタ直接操作による高速数値読み込み
    auto read_uint = [&ptr]() -> uint32_t {
        while (*ptr <= ' ' && *ptr != '\0') ++ptr;
        uint32_t x = 0;
        while (*ptr >= '0' && *ptr <= '9') {
            x = x * 10 + (*ptr - '0');
            ++ptr;
        }
        return x;
    };

    uint32_t H = read_uint();
    uint32_t W = read_uint();

    std::vector<uint32_t> S(H, 0);
    uint32_t T = 0;

    for (uint32_t i = 0; i < H; ++i) {
        uint32_t row_sum = 0;
        for (uint32_t j = 0; j < W; ++j) {
            row_sum += read_uint();
        }
        S[i] = row_sum;
        T += row_sum;
    }

    // 出力バッファによる一括書き出し
    constexpr size_t OUT_BUF_SIZE = 16 * 1024 * 1024; // 16MB
    std::vector<char> out_buf(OUT_BUF_SIZE);
    char* out_ptr = out_buf.data();

    for (uint32_t i = 0; i < H; ++i) {
        uint32_t x = S[i] + T;
        if (x == 0) {
            *out_ptr++ = '0';
        } else {
            char digits[12];
            int len = 0;
            while (x > 0) {
                digits[len++] = static_cast<char>('0' + (x % 10));
                x /= 10;
            }
            while (len > 0) {
                *out_ptr++ = digits[--len];
            }
        }
        *out_ptr++ = '\n';

        // バッファ容量チェック
        if (out_ptr - out_buf.data() > OUT_BUF_SIZE - 64) {
            fwrite(out_buf.data(), 1, out_ptr - out_buf.data(), stdout);
            out_ptr = out_buf.data();
        }
    }

    if (out_ptr > out_buf.data()) {
        fwrite(out_buf.data(), 1, out_ptr - out_buf.data(), stdout);
    }

    return 0;
}
0