結果

問題 No.3677 Global Checksum
コンテスト
ユーザー harurun
提出日時 2026-09-03 22:36:53
言語 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  
実行時間 -
コード長 4,648 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 173 ms
コンパイル使用メモリ 47,580 KB
実行使用メモリ 9,700 KB
最終ジャッジ日時 2026-09-04 23:13:16
合計ジャッジ時間 3,676 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 12 TLE * 1 -- * 7
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#pragma GCC optimize("O3")

#include <cstdint>
#include <cstddef>
#include <cstring>
#include <unistd.h>

using u32 = uint32_t;

// H <= 10^6
static u32 S[1000000];

class FastInput {
    static constexpr size_t SZ = 1u << 16;

    char buf[SZ + 32];
    char* p = buf;
    char* e = buf;

    __attribute__((noinline))
    void refill() {
        const size_t rem = static_cast<size_t>(e - p);

        if (rem) {
            std::memmove(buf, p, rem);
        }

        p = buf;
        e = buf + rem;

        // 次の整数を安全に読める程度までは確保する
        do {
            const ssize_t n =
                ::read(0, e, SZ - static_cast<size_t>(e - buf));

            if (n <= 0) break;

            e += n;
        } while (e - p < 16);

        // look-ahead 用
        std::memset(e, 0, 16);
    }

public:
    __attribute__((always_inline))
    inline u32 next() {
        if (__builtin_expect(e - p < 16, 0)) {
            refill();
        }

        // 入力は非負整数のみ
        while (*p <= ' ') ++p;

        u32 x = static_cast<u32>(*p++ - '0');
        if (*p <= ' ') return x;

        x = x * 10 + static_cast<u32>(*p++ - '0');
        if (*p <= ' ') return x;

        x = x * 10 + static_cast<u32>(*p++ - '0');
        if (*p <= ' ') return x;

        x = x * 10 + static_cast<u32>(*p++ - '0');
        if (*p <= ' ') return x;

        x = x * 10 + static_cast<u32>(*p++ - '0');
        if (*p <= ' ') return x;

        x = x * 10 + static_cast<u32>(*p++ - '0');
        if (*p <= ' ') return x;

        x = x * 10 + static_cast<u32>(*p++ - '0');
        if (*p <= ' ') return x;

        x = x * 10 + static_cast<u32>(*p++ - '0');
        if (*p <= ' ') return x;

        // A_{i,j} < 10^9 なので A はここで必ず終了する。
        // H, W もこれより小さいので入力中の全整数に使える。
        x = x * 10 + static_cast<u32>(*p++ - '0');

        return x;
    }
};


// 00, 01, ..., 99
static constexpr char DIG2[] =
    "00010203040506070809"
    "10111213141516171819"
    "20212223242526272829"
    "30313233343536373839"
    "40414243444546474849"
    "50515253545556575859"
    "60616263646566676869"
    "70717273747576777879"
    "80818283848586878889"
    "90919293949596979899";


__attribute__((always_inline))
static inline char* put2(char* p, u32 x) {
    const char* q = DIG2 + x * 2;

    *p++ = q[0];
    *p++ = q[1];

    return p;
}


__attribute__((always_inline))
static inline char* put4(char* p, u32 x) {
    const u32 hi = x / 100;

    p = put2(p, hi);
    return put2(p, x - hi * 100);
}


__attribute__((always_inline))
static inline char* put1to4(char* p, u32 x) {
    if (x < 10) {
        *p++ = static_cast<char>('0' + x);
        return p;
    }

    if (x < 100) {
        return put2(p, x);
    }

    if (x < 1000) {
        const u32 hi = x / 100;

        *p++ = static_cast<char>('0' + hi);

        return put2(p, x - hi * 100);
    }

    return put4(p, x);
}


__attribute__((always_inline))
static inline char* putU32(char* p, u32 x) {
    if (x < 10000) {
        return put1to4(p, x);
    }

    if (x < 100000000u) {
        const u32 hi = x / 10000u;
        const u32 lo = x - hi * 10000u;

        p = put1to4(p, hi);

        return put4(p, lo);
    }

    // uint32_t <= 4294967295 なので hi は 1..42
    const u32 hi = x / 100000000u;
    const u32 lo = x - hi * 100000000u;

    p = put1to4(p, hi);

    const u32 mid = lo / 10000u;

    p = put4(p, mid);

    return put4(p, lo - mid * 10000u);
}


class FastOutput {
    static constexpr size_t SZ = 1u << 16;

    char buf[SZ + 16];
    size_t pos = 0;

public:
    ~FastOutput() {
        flush();
    }

    __attribute__((noinline))
    void flush() {
        size_t done = 0;

        while (done < pos) {
            const ssize_t n =
                ::write(1, buf + done, pos - done);

            if (n <= 0) break;

            done += static_cast<size_t>(n);
        }

        pos = 0;
    }

    __attribute__((always_inline))
    inline void writeU32(u32 x) {
        if (__builtin_expect(pos + 11 > SZ, 0)) {
            flush();
        }

        char* q = putU32(buf + pos, x);

        *q++ = '\n';

        pos = static_cast<size_t>(q - buf);
    }
};


int main() {
    FastInput in;
    FastOutput out;

    const u32 H = in.next();
    const u32 W = in.next();

    u32 T = 0;

    for (u32 i = 0; i < H; ++i) {
        u32 s = 0;

        for (u32 j = 0; j < W; ++j) {
            s += in.next();
        }

        S[i] = s;
        T += s;
    }

    for (u32 i = 0; i < H; ++i) {
        out.writeU32(S[i] + T);
    }
}
0