Submission #61302590


Source Code Expand

#line 1 "main.cpp"
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

#include <cstdio>
#include <cassert>
#include <cmath>
#include <cstring>
#include <string>
#include <functional>
#include <stack>
#include <utility>
#include <queue>
#include <algorithm>
#include <execinfo.h>
#include <iostream>
#include <set>
#include <numeric>
#include <map>
using namespace std;
using ll = long long int;

#ifdef DEBUG
#define STDERR(...) fprintf(stderr, __VA_ARGS__);
#define ASSERT_OVERLOAD(e1,e2,NAME,...) NAME
#define ASSERT_1(x) assert_with_backtrace((x))
#define ASSERT_2(x, y) assert_with_backtrace((x), (y))
#define ASSERT(...) ASSERT_OVERLOAD(__VA_ARGS__, ASSERT_2, ASSERT_1)(__VA_ARGS__)
#define DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__), printf(__VA_ARGS__)
#else
#define STDERR(...)
#define ASSERT(...)
#define DEBUG_PRINT(...)
#endif

// assert で落ちたときにバックトレースする (`-g -rdynamic` が必要)
// デバッグモードでのみ有効
void assert_with_backtrace(bool condition, std::string error_msg="") {
    if(!condition) {
        void* callstack[256];
        int i, frames = backtrace(callstack, 256);
        char** strs = backtrace_symbols(callstack, frames);
        for (i = 0; i < frames; ++i) {
            fprintf(stderr, "%s\n", strs[i]);
        }
        free(strs);
        fprintf(stderr, "%s\n", error_msg.c_str());
        ASSERT(false);
    }
}

template <typename Tp>
bool chmin(Tp& a, const Tp& b) {
    if(a > b) {
        a = b;
        return true;
    } else {
        return false;
    }
}
template <typename Tp>
bool chmax(Tp& a, const Tp& b) {
    if(a < b) {
        a = b;
        return true;
    } else {
        return false;
    }
}

#line 1 "/home/tsutaj/Documents/compro/cpp_library/marathon/timer.cpp"
#include <chrono>

class Timer {
    chrono::high_resolution_clock::time_point start, end;
    double limit;  // 秒数を指定

public:
    Timer() {
        start = chrono::high_resolution_clock::now();
    }
    Timer(double l) {
        start = chrono::high_resolution_clock::now();
        limit = l;
    }

    double getTime() {
        end = chrono::high_resolution_clock::now();
        return chrono::duration<double>(end - start).count();
    }

    bool isTimeOver() {
        if (getTime() > limit) {
            return true;
        }
        return false;
    }

    double getLimit() { return limit; }
    void setLimit(double l) {
        limit = l;
    }
    void setStart() { start = chrono::high_resolution_clock::now(); }
};
#line 1 "/home/tsutaj/Documents/compro/cpp_library/marathon/rand.cpp"
// [lb, ub] の閉区間内の値をランダムに返す構造体
#include <random>
#include <limits>

struct Rand {
public:
    Rand() = default;
    Rand(std::mt19937::result_type seed) : eng(seed) {}

    uint32_t NextUInt(uint32_t lb, uint32_t ub) {
        return std::uniform_int_distribution<uint32_t>{lb, ub}(eng);
    }
    uint32_t NextUInt() {
        return std::uniform_int_distribution<uint32_t>{0, std::numeric_limits<uint32_t>::max()}(eng);
    }

    int32_t NextInt(int32_t lb, int32_t ub) {
        return std::uniform_int_distribution<int32_t>{lb, ub}(eng);
    }
    int32_t NextInt() {
        return std::uniform_int_distribution<int32_t>{0, std::numeric_limits<int32_t>::max()}(eng);
    }

    uint64_t NextULong(uint64_t lb, uint64_t ub) {
        return std::uniform_int_distribution<uint64_t>{lb, ub}(eng);
    }
    uint64_t NextULong() {
        return std::uniform_int_distribution<uint64_t>{0, std::numeric_limits<uint64_t>::max()}(eng);
    }

    int64_t NextLong(int64_t lb, int64_t ub) {
        return std::uniform_int_distribution<int64_t>{lb, ub}(eng);
    }
    int64_t NextLong() {
        return std::uniform_int_distribution<int64_t>{0, std::numeric_limits<int64_t>::max()}(eng);
    }

    double NextDouble(double lb = 0.0, double ub = 1.0) {
        return std::uniform_real_distribution<double>{lb, ub}(eng);
    }
private:
    std::mt19937 eng{std::random_device{}()};
};
#line 1 "/home/tsutaj/Documents/compro/cpp_library/marathon/chokudai_search.cpp"
/**
 * @brief chokudai サーチ
 * @docs docs/marathon/chokudai_search.md
 */

#line 1 "/home/tsutaj/Documents/compro/cpp_library/marathon/interval_heap.cpp"
template <typename Tp>
class IntervalHeap {
   public:
    template <class Iterator>
    IntervalHeap(Iterator first, Iterator last) : data_(first, last) {
        make_heap();
    }
    IntervalHeap() = default;

    size_t size() const { return data_.size(); }
    void clear() { data_.clear(); }
    void emplace(const Tp& val) {
        data_.push_back(val);
        up(size() - 1);
    }
    void push(const Tp& val) { emplace(val); }
    const Tp& top_min() const { return data_[size() >= 2]; }
    const Tp& top_max() const { return data_[0]; }
    void pop_min() {
        if(size() <= 2) {
            data_.pop_back();
        } else {
            swap(data_[1], data_.back());
            data_.pop_back();
            const size_t k = down(1);
            up(k);
        }
    }
    void pop_max() {
        if(size() <= 1) {
            data_.pop_back();
        } else {
            swap(data_[0], data_.back());
            data_.pop_back();
            const size_t k = down(0);
            up(k);
        }
    }

   private:
    vector<Tp> data_;
    inline size_t to_k_max(size_t k) { return k & ~1; }
    inline size_t to_k_min(size_t k) { return k | 1; }
    inline size_t get_parent(size_t k, bool is_max) { return (((k >> 1) - 1) & ~1) | (is_max ? 0 : 1); }

    size_t down(size_t k) {
        const size_t s = size();
        if(k & 1) {
            // min heap
            while(true) {
                const size_t cl = (k << 1) + 1;
                const size_t cr = (k << 1) + 3;
                if(cl >= s) break;
                const size_t c = (cr >= s || data_[cl] < data_[cr]) ? cl : cr;
                if(data_[c] < data_[k]) {
                    swap(data_[k], data_[c]);
                    k = c;
                } else {
                    break;
                }
            }
        } else {
            // max heap
            while(true) {
                const size_t cl = (k << 1) + 2;
                const size_t cr = (k << 1) + 4;
                if(cl >= s) break;
                const size_t c = (cr >= s || data_[cr] < data_[cl]) ? cl : cr;
                if(data_[k] < data_[c]) {
                    swap(data_[k], data_[c]);
                    k = c;
                } else {
                    break;
                }
            }
        }
        return k;
    }
    void up(size_t k, size_t root = 1) {
        const size_t k_max = to_k_max(k);
        const size_t k_min = to_k_min(k);
        if(k_min < size() && data_[k_max] < data_[k_min]) {
            swap(data_[k_max], data_[k_min]);
            k ^= 1;
        }

        size_t p;
        // max heap
        while(root < k && data_[p = get_parent(k, true)] < data_[k]) {
            swap(data_[k], data_[p]);
            k = p;
        }
        // min heap
        while(root < k && data_[k] < data_[p = get_parent(k, false)]) {
            swap(data_[k], data_[p]);
            k = p;
        }
    }
    void make_heap() {
        for(size_t i = size(); i--;) {
            if((i & 1) && data_[i - 1] < data_[i]) {
                swap(data_[i - 1], data_[i]);
            }
            size_t k = down(i);
            up(k, i);
        }
    }
};
#line 7 "/home/tsutaj/Documents/compro/cpp_library/marathon/chokudai_search.cpp"

template <class State, class Timer>
class ChokudaiSearch {
   public:
    ChokudaiSearch() : num_iter_(-1) {}
    void init(int max_turns, double search_time, int time_check_iter) {
        states_.resize(max_turns + 1);
        search_time_ = search_time;
        num_iter_ = 0;
        time_check_iter_ = time_check_iter;
        max_num_states_.resize(max_turns, 1 << 30);
    }
    void set_max_num_states(int max_num_state) {
        fill(max_num_states_.begin(), max_num_states_.end(), max_num_state);
    }
    void set_max_num_states(const vector<int> &max_num_states) {
        assert(max_num_states.size() == max_num_states_.size());
        max_num_states_ = max_num_states;
    }
    void register_state(int turns, const State &state) {
        states_[turns].emplace(state);
        while(states_[turns].size() > max_num_states_[turns]) {
            states_[turns].pop_max();
        }
    }
    void search(Timer &timer, const auto &add_next_states) {
        assert(num_iter_ >= 0);
        const double start_time = timer.getTime();
        for(num_iter_ = 0;; num_iter_++) {
            for(int turns = 0; turns + 1 < (int)states_.size(); turns++) {
                if(timer.getTime() - start_time > search_time_) {
                    goto TIME_OVER;
                }
                if(states_[turns].size() == 0) continue;
                State state = states_[turns].top_min();
                states_[turns].pop_min();
                add_next_states(turns, state);
            }
        }
    TIME_OVER:;
        fprintf(stderr, "chokudai search: num_iter = %d\n", num_iter_);
    }
    const State &get_best_state() const { return states_.back().top_min(); }

   private:
    double search_time_;
    int num_iter_;
    int time_check_iter_;
    vector<IntervalHeap<State>> states_;
    vector<int> max_num_states_;
};
#line 74 "main.cpp"
// #include "xrand1.h"
Rand rnd(35023503980LL);
Timer timer;

constexpr int MAX_SET_SIZE = 3;
struct Parameters {
    double time_limit = 1.95;
} params;

constexpr int N = 9;
constexpr int M = 20;
constexpr int S = 3;
constexpr int K = 81;
constexpr int MOD = 998244353;
int stamps[M][S][S];

int mod_add(int v1, int v2) {
    int ret = v1 + v2;
    while(ret >= MOD) ret -= MOD;
    while(ret < 0) ret += MOD;
    return ret;
}
int mod_sub(int v1, int v2) {
    int ret = v1 - v2;
    while(ret < 0) ret += MOD;
    return ret;
}

struct Board {
public:
    void input() {
        for(int i=0; i<N; i++) {
            for(int j=0; j<N; j++) {
                scanf("%d", &board[i][j]);
            }
        }
    }
    int* operator[](int r) { return board[r]; }
    const int* operator[](int r) const { return board[r]; }
    int cell_score(int r, int c) const { return board[r][c]; }
    ll calc_score_naive() const {
        ll score = 0;
        for(int i=0; i<N; i++) {
            for(int j=0; j<N; j++) {
                score += cell_score(i, j);
            }
        }
        return score;
    }
private:
    int board[N][N];
};

struct Operation {
    int r, c, t;
    Operation() = default;
    Operation(int r, int c, int t) : r(r), c(c), t(t) {}
};

struct State {
public:
    Board board;
    int ops;
    ll score;
    Operation operations[K];

    State() = default;
    State(const Board& board) : board(board), ops(0), score(board.calc_score_naive()) {}
    inline bool can_add() { return ops < K; }
    inline bool can_del() { return ops > 0; }
    void dump_answer() const {
        printf("%d\n", ops);
        for(int i=0; i<ops; i++) {
            auto [r, c, t] = operations[i];
            printf("%d %d %d\n", t, r, c);
        }
    }

    void add(int r, int c, int t) {
        for(int dr=0; dr<S; dr++) {
            for(int dc=0; dc<S; dc++) {
                ASSERT(r + dr < N);
                ASSERT(c + dc < N);

                score -= board[r + dr][c + dc];
                board[r + dr][c + dc] = mod_add(board[r + dr][c + dc], stamps[t][dr][dc]);
                score += board[r + dr][c + dc];
            }
        }
        operations[ops++] = Operation(r, c, t);
    }
    void del(int k) {
        const auto& [r, c, t] = operations[k];
        for(int dr=0; dr<S; dr++) {
            for(int dc=0; dc<S; dc++) {
                ASSERT(r + dr < N);
                ASSERT(c + dc < N);
                score -= board[r + dr][c + dc];
                board[r + dr][c + dc] = mod_sub(board[r + dr][c + dc], stamps[t][dr][dc]);
                score += board[r + dr][c + dc];
            }
        }
        swap(operations[k], operations[ops - 1]);
        ops--;
    }
};

void input(Board& initial_board) {
    int n, m, k; scanf("%d%d%d", &n, &m, &k);
    initial_board.input();
    for(int i=0; i<M; i++) {
        for(int r=0; r<S; r++) {
            for(int c=0; c<S; c++) {
                scanf("%d", &stamps[i][r][c]);
            }
        }
    }
}

bool need_update(ll cur_score, ll nxt_score, double temp = 1e-9) {
    ll score_diff = nxt_score - cur_score;
    // return score_diff > 0;
    return rnd.NextDouble() < exp(score_diff / temp);
}

void solve1(const State& initial_state) {
    State cur_state = initial_state;
    int num_iter = 0;
    DEBUG_PRINT("initial score: %lld\n", cur_state.score);
    // 5.0x10^8 * 9 = 4.5*10^9
    double start_temp = 1.0e9;
    double end_temp = 0.0;
    double start_time = timer.getTime();
    double time_ratio = (timer.getTime() - start_time) / (params.time_limit - start_time);
    double cur_temp = start_temp + (end_temp - start_temp) * time_ratio;
    State best_state = cur_state;
    ll best_score = cur_state.score;
    for(; ; num_iter++) {
        if (num_iter % 10000 == 0) {
            if (timer.isTimeOver()) {
                break;
            }
            time_ratio = (timer.getTime() - start_time) / (params.time_limit - start_time);
            cur_temp = start_temp + (end_temp - start_temp) * time_ratio;
        }
        int kind = rnd.NextInt(0, 2);
        if (kind == 0) {
            if (!cur_state.can_add()) continue;
            int r = rnd.NextInt(0, N - S);
            int c = rnd.NextInt(0, N - S);
            int t = rnd.NextInt(0, M - 1);

            ll cur_score = cur_state.score;
            cur_state.add(r, c, t);
            ll nxt_score = cur_state.score;
            if (need_update(cur_score, nxt_score, cur_temp)) {
                // do nothing
            } else {
                int k = cur_state.ops - 1;
                cur_state.del(k);
            }
        } else if (kind == 1) {
            if (!cur_state.can_del()) continue;
            int k = rnd.NextInt(0, cur_state.ops - 1);
            auto [r, c, t] = cur_state.operations[k];

            ll cur_score = cur_state.score;
            cur_state.del(k);
            ll nxt_score = cur_state.score;
            ll score_diff = nxt_score - cur_score;
            if (need_update(cur_score, nxt_score, cur_temp)) {
                // do nothing
            } else {
                cur_state.add(r, c, t);
            }
        } else if (kind == 2) {
            if (!cur_state.can_del()) continue;
            int k = rnd.NextInt(0, cur_state.ops - 1);
            auto [r1, c1, t1] = cur_state.operations[k];

            int r2 = rnd.NextInt(0, N - S);
            int c2 = rnd.NextInt(0, N - S);
            int t2 = rnd.NextInt(0, M - 1);

            ll cur_score = cur_state.score;
            cur_state.del(k);
            cur_state.add(r2, c2, t2);
            ll nxt_score = cur_state.score;
            if (need_update(cur_score, nxt_score, cur_temp)) {
                // do nothing
            } else {
                cur_state.del(cur_state.ops - 1);
                cur_state.add(r1, c1, t1);
            }
        } else if (kind == 3) {
            if (!cur_state.can_add()) continue;
            int num_add = rnd.NextInt(1, min(5, K - cur_state.ops));
            int r = rnd.NextInt(0, N - S);
            int c = rnd.NextInt(0, N - S);

            ll cur_score = cur_state.score;
            for(int i=0; i<num_add; i++) {
                int t = rnd.NextInt(0, M - 1);
                cur_state.add(r, c, t);
            }
            ll nxt_score = cur_state.score;
            if (need_update(cur_score, nxt_score, cur_temp)) {
                // do nothing
            } else {
                for(int i=0; i<num_add; i++) {
                    cur_state.del(cur_state.ops - 1);
                }
            }
        }
        if (cur_state.score > best_score) {
            best_score = cur_state.score;
            best_state = cur_state;
        }
    }
    DEBUG_PRINT("num_iter = %d, final score: %lld\n", num_iter, best_state.score);
    best_state.dump_answer();
}

const int vec2int(const vector<int>& vec) {
    int ret = 0;
    for(int i=0; i<MAX_SET_SIZE; i++) {
        int k = i < vec.size() ? vec[i] : M;
        ret = ret * (M + 1) + k;
    }
    return ret;
}
const vector<int> int2vec(int val) {
    vector<int> vec;
    for(int i=0; i<MAX_SET_SIZE; i++) {
        int k = val % (M + 1);
        if (k < M) vec.emplace_back(k);
        val /= (M + 1);
    }
    return vec;
}

vector< pair<int, vector<int>> > stamps_candidate;
vector<int> idx2int;
void precalc() {
    auto dfs = [&](auto&& self, vector<int>& vec, int k, int sum) -> void {
        if (vec.size() > MAX_SET_SIZE) return;
        if (k == M) {
            if (!vec.empty()) {
                stamps_candidate.emplace_back(sum, vec);
            }
            return;
        }

        self(self, vec, k+1, sum);
        vec.push_back(k);
        self(self, vec, k, (sum + stamps[k][0][0]) % MOD);
        vec.pop_back();
    };
    vector<int> empty_vec;
    dfs(dfs, empty_vec, 0, 0);

    sort(stamps_candidate.begin(), stamps_candidate.end(), [&](const auto& p1, const auto& p2) {
        if (p1.first != p2.first) return p1.first < p2.first;
        return p1.second.size() < p2.second.size();
    });
    vector< pair<int, vector<int>> > new_stamps_candidate;
    for(const auto& [sum, vec] : stamps_candidate) {
        bool add = false;
        add |= new_stamps_candidate.empty();
        add |= !add && new_stamps_candidate.back().first != sum;
        add |= !add && new_stamps_candidate.back().first == sum && new_stamps_candidate.back().second.size() == vec.size();
        if (add) {
            new_stamps_candidate.emplace_back(sum, vec);
            idx2int.emplace_back(vec2int(vec));
        }
    }
    // fprintf(stderr, "new_stamps_candidate size = %zu\n", new_stamps_candidate.size());
    // for(auto& [sum, vec] : new_stamps_candidate) {
    //     fprintf(stderr, "sum = %d, vec = {", sum);
    //     for(int i=0; i<vec.size(); i++) {
    //         fprintf(stderr, "%d%c", vec[i], i+1 == vec.size() ? '}' : ',');
    //     }
    //     fprintf(stderr, "\n");
    // }
    swap(stamps_candidate, new_stamps_candidate);
}

struct CSState {
    State s;
    ll score;
    ll decided_sum;
    CSState() = default;
    bool operator<(const CSState &other) const {
        return score < other.score;
    }
    CSState(const State &s, ll score, ll decided_sum) : s(s), score(score), decided_sum(decided_sum) {}
};

void solve2(const State& initial_state) {
    auto extract = [&](const State& state, int r, int c) {
        int n_dr = (r == 6 ? 3 : 1);
        int n_dc = (c == 6 ? 3 : 1);
        ll res = 0;
        for(int dr=0; dr<n_dr; dr++) {
            for(int dc=0; dc<n_dc; dc++) {
                res += state.board[r + dr][c + dc];
            }
        }
        return res;
    };

    ChokudaiSearch<CSState, Timer> chokudai_search;
    chokudai_search.init(50, timer.getLimit() - timer.getTime(), 100);
    chokudai_search.register_state(0, CSState{initial_state, 0LL, 0LL});
    chokudai_search.set_max_num_states(3000);

    vector<int> limit_k_vec, num_neighbors_vec;
    for(int stage=0, limit_k=3; stage<49; stage++) {
        int r = stage / 7, c = stage % 7;
        bool is_edge = (r == 6 || c == 6);
        int add_k = 1;
        if (r == 6 && c == 6) add_k = 6;
        else if (r == 6 || c == 6) add_k = 3;
        limit_k += add_k;
        limit_k_vec.emplace_back(limit_k);
        const int num_neighbors = add_k == 1 ? 100 : add_k == 3 ? 150 : 200;
        num_neighbors_vec.emplace_back(num_neighbors);
    }

    auto add_next_states = [&](int actual_turns, CSState& state) {
        const int stage = actual_turns - (actual_turns == 49);
        const int r = stage / 7;
        const int c = stage % 7;
        const bool is_edge = (r == 6 || c == 6);
        int target = MOD - 1 - state.s.board[r][c];
        int idx = upper_bound(stamps_candidate.begin(), stamps_candidate.end(), make_pair(target, vector<int>{M})) - stamps_candidate.begin();
        idx--;

        {
            ll n_decided_sum = state.decided_sum + extract(state.s, r, c);
            ll n_score = stage < 48 ? n_decided_sum : state.s.score;
            n_score -= 1LL * state.s.ops * 30000000;
            chokudai_search.register_state(actual_turns + 1, CSState(state.s, -n_score, n_decided_sum)); // 何もしない
        }
        for(int iter=0, ok=true; iter<num_neighbors_vec[stage] && ok;) {
            if (idx < 0) idx = stamps_candidate.size() - 1;
            while (idx >= stamps_candidate.size()) idx--;
            const auto& [sum, vec] = stamps_candidate[idx];
            if (state.s.ops + vec.size() <= limit_k_vec[stage]) {
                iter++;
                for(int i=0; i<(int)vec.size(); i++) {
                    state.s.add(r, c, vec[i]);
                }
                if (is_edge || state.s.board[r][c] >= 700000000) {
                    ll n_decided_sum = state.decided_sum + extract(state.s, r, c);
                    ll n_score = stage < 48 ? n_decided_sum : state.s.score;
                    n_score -= 1LL * state.s.ops * 30000000;
                    chokudai_search.register_state(actual_turns + 1, CSState(state.s, -n_score, n_decided_sum));
                } else {
                    ok = false;
                }
                for(int i=0; i<(int)vec.size(); i++) {
                    state.s.del(state.s.ops - 1);
                }
            }
            idx--;
        }
    };
    chokudai_search.search(timer, add_next_states);
    const State& best_state = chokudai_search.get_best_state().s;
    fprintf(stderr, "best_state score = %lld\n", best_state.score);
    best_state.dump_answer();
}

int main() {
    timer.setStart();
    timer.setLimit(params.time_limit);
    Board initial_board;
    input(initial_board);
    precalc();

    State initial_state(initial_board);
    // solve1(initial_state);
    solve2(initial_state);
    fprintf(stderr, "end time: %lf\n", timer.getTime());
    return 0;
}

Submission Info

Submission Time
Task A - Mod Stamp
User tsutaj
Language C++ 23 (gcc 12.2)
Score 11779375759508
Code Size 22261 Byte
Status AC
Exec Time 1960 ms
Memory 397248 KiB

Compile Error

main.cpp: In function ‘void solve1(const State&)’:
main.cpp:243:16: warning: unused variable ‘score_diff’ [-Wunused-variable]
main.cpp: At global scope:
main.cpp:297:1: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
main.cpp: In function ‘const int vec2int(const std::vector<int>&)’:
main.cpp:300:19: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
main.cpp: In function ‘void solve2(const State&)’:
main.cpp:393:14: warning: unused variable ‘is_edge’ [-Wunused-variable]
main.cpp: In lambda function:
main.cpp:420:24: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, std::vector<int> > >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
main.cpp:422:42: warning: comparison of integer expressions of different signedness: ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} and ‘__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type’ {aka ‘int’} [-Wsign-compare]
/home/tsutaj/Documents/compro/cpp_library/marathon/chokudai_search.cpp: In instantiation of ‘void ChokudaiSearch<State, Timer>::register_state(int, const State&) [with State = CSState; Timer = Timer]’:
main.cpp:387:35:   required from here
/home/tsutaj/Documents/compro/cpp_library/marathon/chokudai_search.cpp:28:37: warning: comparison of integer expressions of different signedness: ‘size_t’ {aka ‘long unsigned int’} and ‘__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type’ {aka ‘int’} [-Wsign-compare]
main.cpp: In function ‘void input(Board&)’:
main.cpp:182:23: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
main.cpp:187:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
main.cpp: In member function ‘void Board::input()’:
main.cpp:107:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]

Judge Result

Set Name test_ALL
Score / Max Score 11779375759508 / 12089754470400
Status
AC × 150
Set Name Test Cases
test_ALL test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt, test_0100.txt, test_0101.txt, test_0102.txt, test_0103.txt, test_0104.txt, test_0105.txt, test_0106.txt, test_0107.txt, test_0108.txt, test_0109.txt, test_0110.txt, test_0111.txt, test_0112.txt, test_0113.txt, test_0114.txt, test_0115.txt, test_0116.txt, test_0117.txt, test_0118.txt, test_0119.txt, test_0120.txt, test_0121.txt, test_0122.txt, test_0123.txt, test_0124.txt, test_0125.txt, test_0126.txt, test_0127.txt, test_0128.txt, test_0129.txt, test_0130.txt, test_0131.txt, test_0132.txt, test_0133.txt, test_0134.txt, test_0135.txt, test_0136.txt, test_0137.txt, test_0138.txt, test_0139.txt, test_0140.txt, test_0141.txt, test_0142.txt, test_0143.txt, test_0144.txt, test_0145.txt, test_0146.txt, test_0147.txt, test_0148.txt, test_0149.txt
Case Name Status Exec Time Memory
test_0000.txt AC 1957 ms 224320 KiB
test_0001.txt AC 1957 ms 215548 KiB
test_0002.txt AC 1958 ms 222140 KiB
test_0003.txt AC 1957 ms 219172 KiB
test_0004.txt AC 1957 ms 221464 KiB
test_0005.txt AC 1957 ms 228516 KiB
test_0006.txt AC 1957 ms 215832 KiB
test_0007.txt AC 1957 ms 223924 KiB
test_0008.txt AC 1957 ms 226236 KiB
test_0009.txt AC 1957 ms 229588 KiB
test_0010.txt AC 1957 ms 227804 KiB
test_0011.txt AC 1957 ms 231400 KiB
test_0012.txt AC 1960 ms 397248 KiB
test_0013.txt AC 1958 ms 222464 KiB
test_0014.txt AC 1957 ms 231064 KiB
test_0015.txt AC 1957 ms 229144 KiB
test_0016.txt AC 1957 ms 225196 KiB
test_0017.txt AC 1957 ms 224016 KiB
test_0018.txt AC 1957 ms 225024 KiB
test_0019.txt AC 1957 ms 217732 KiB
test_0020.txt AC 1957 ms 221336 KiB
test_0021.txt AC 1957 ms 230532 KiB
test_0022.txt AC 1957 ms 220068 KiB
test_0023.txt AC 1960 ms 394900 KiB
test_0024.txt AC 1957 ms 222172 KiB
test_0025.txt AC 1957 ms 218460 KiB
test_0026.txt AC 1957 ms 218364 KiB
test_0027.txt AC 1957 ms 216432 KiB
test_0028.txt AC 1957 ms 216828 KiB
test_0029.txt AC 1957 ms 222540 KiB
test_0030.txt AC 1957 ms 220956 KiB
test_0031.txt AC 1957 ms 215948 KiB
test_0032.txt AC 1957 ms 225032 KiB
test_0033.txt AC 1957 ms 218396 KiB
test_0034.txt AC 1959 ms 395820 KiB
test_0035.txt AC 1957 ms 222632 KiB
test_0036.txt AC 1957 ms 221616 KiB
test_0037.txt AC 1957 ms 220208 KiB
test_0038.txt AC 1957 ms 223100 KiB
test_0039.txt AC 1957 ms 218232 KiB
test_0040.txt AC 1957 ms 222164 KiB
test_0041.txt AC 1957 ms 221532 KiB
test_0042.txt AC 1957 ms 227348 KiB
test_0043.txt AC 1957 ms 219920 KiB
test_0044.txt AC 1957 ms 221108 KiB
test_0045.txt AC 1957 ms 216912 KiB
test_0046.txt AC 1957 ms 234712 KiB
test_0047.txt AC 1957 ms 224744 KiB
test_0048.txt AC 1959 ms 389108 KiB
test_0049.txt AC 1957 ms 222300 KiB
test_0050.txt AC 1957 ms 219048 KiB
test_0051.txt AC 1957 ms 223052 KiB
test_0052.txt AC 1957 ms 228776 KiB
test_0053.txt AC 1957 ms 223720 KiB
test_0054.txt AC 1957 ms 220536 KiB
test_0055.txt AC 1957 ms 223128 KiB
test_0056.txt AC 1957 ms 227748 KiB
test_0057.txt AC 1957 ms 216884 KiB
test_0058.txt AC 1957 ms 219184 KiB
test_0059.txt AC 1957 ms 231636 KiB
test_0060.txt AC 1957 ms 220668 KiB
test_0061.txt AC 1957 ms 220428 KiB
test_0062.txt AC 1957 ms 226728 KiB
test_0063.txt AC 1957 ms 227744 KiB
test_0064.txt AC 1957 ms 227544 KiB
test_0065.txt AC 1957 ms 223320 KiB
test_0066.txt AC 1959 ms 394052 KiB
test_0067.txt AC 1957 ms 224564 KiB
test_0068.txt AC 1957 ms 223308 KiB
test_0069.txt AC 1957 ms 226120 KiB
test_0070.txt AC 1957 ms 226236 KiB
test_0071.txt AC 1957 ms 225748 KiB
test_0072.txt AC 1957 ms 226084 KiB
test_0073.txt AC 1957 ms 228404 KiB
test_0074.txt AC 1957 ms 204932 KiB
test_0075.txt AC 1957 ms 230804 KiB
test_0076.txt AC 1957 ms 223404 KiB
test_0077.txt AC 1957 ms 219044 KiB
test_0078.txt AC 1957 ms 224160 KiB
test_0079.txt AC 1957 ms 215008 KiB
test_0080.txt AC 1957 ms 222052 KiB
test_0081.txt AC 1957 ms 216824 KiB
test_0082.txt AC 1957 ms 230312 KiB
test_0083.txt AC 1957 ms 214976 KiB
test_0084.txt AC 1957 ms 227700 KiB
test_0085.txt AC 1957 ms 213960 KiB
test_0086.txt AC 1957 ms 227564 KiB
test_0087.txt AC 1957 ms 220848 KiB
test_0088.txt AC 1960 ms 396016 KiB
test_0089.txt AC 1958 ms 227176 KiB
test_0090.txt AC 1957 ms 217916 KiB
test_0091.txt AC 1960 ms 393744 KiB
test_0092.txt AC 1958 ms 226944 KiB
test_0093.txt AC 1957 ms 228788 KiB
test_0094.txt AC 1957 ms 220824 KiB
test_0095.txt AC 1957 ms 215968 KiB
test_0096.txt AC 1957 ms 214308 KiB
test_0097.txt AC 1957 ms 227500 KiB
test_0098.txt AC 1958 ms 224804 KiB
test_0099.txt AC 1957 ms 220188 KiB
test_0100.txt AC 1957 ms 220628 KiB
test_0101.txt AC 1957 ms 218844 KiB
test_0102.txt AC 1958 ms 231204 KiB
test_0103.txt AC 1957 ms 219468 KiB
test_0104.txt AC 1957 ms 219276 KiB
test_0105.txt AC 1957 ms 227496 KiB
test_0106.txt AC 1957 ms 221432 KiB
test_0107.txt AC 1957 ms 214384 KiB
test_0108.txt AC 1957 ms 221140 KiB
test_0109.txt AC 1957 ms 224256 KiB
test_0110.txt AC 1957 ms 226088 KiB
test_0111.txt AC 1957 ms 224924 KiB
test_0112.txt AC 1957 ms 220156 KiB
test_0113.txt AC 1957 ms 216920 KiB
test_0114.txt AC 1957 ms 225828 KiB
test_0115.txt AC 1957 ms 222436 KiB
test_0116.txt AC 1957 ms 224480 KiB
test_0117.txt AC 1960 ms 395360 KiB
test_0118.txt AC 1957 ms 218936 KiB
test_0119.txt AC 1958 ms 228456 KiB
test_0120.txt AC 1957 ms 229764 KiB
test_0121.txt AC 1957 ms 227512 KiB
test_0122.txt AC 1957 ms 219080 KiB
test_0123.txt AC 1957 ms 225228 KiB
test_0124.txt AC 1957 ms 225036 KiB
test_0125.txt AC 1957 ms 224536 KiB
test_0126.txt AC 1957 ms 226912 KiB
test_0127.txt AC 1957 ms 210568 KiB
test_0128.txt AC 1957 ms 220288 KiB
test_0129.txt AC 1960 ms 393724 KiB
test_0130.txt AC 1957 ms 222848 KiB
test_0131.txt AC 1957 ms 230176 KiB
test_0132.txt AC 1957 ms 231744 KiB
test_0133.txt AC 1957 ms 220984 KiB
test_0134.txt AC 1957 ms 225064 KiB
test_0135.txt AC 1957 ms 226232 KiB
test_0136.txt AC 1957 ms 216344 KiB
test_0137.txt AC 1957 ms 232508 KiB
test_0138.txt AC 1957 ms 223688 KiB
test_0139.txt AC 1957 ms 227952 KiB
test_0140.txt AC 1957 ms 218480 KiB
test_0141.txt AC 1957 ms 224984 KiB
test_0142.txt AC 1957 ms 220048 KiB
test_0143.txt AC 1957 ms 223732 KiB
test_0144.txt AC 1957 ms 229448 KiB
test_0145.txt AC 1957 ms 214188 KiB
test_0146.txt AC 1957 ms 219608 KiB
test_0147.txt AC 1957 ms 218204 KiB
test_0148.txt AC 1957 ms 222488 KiB
test_0149.txt AC 1960 ms 397144 KiB