結果
| 問題 | No.3677 Global Checksum |
| コンテスト | |
| ユーザー |
秋ナス🍆
|
| 提出日時 | 2026-09-05 09:58:04 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.92.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,477 bytes |
| 記録 | |
| コンパイル時間 | 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 |
ソースコード
#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;
}
秋ナス🍆