Submission #33008172


Source Code Expand

#include <bits/stdc++.h>

#include <atcoder/all>

using namespace std;
using namespace atcoder;
#define REP(i, a, n) for (int i = (a); i < (int)(n); i++)
#define rep(i, n) REP(i, 0, n)
#define FOR(it, c) for (__typeof((c).begin()) it = (c).begin(); it != (c).end(); ++it)
#define ALLOF(c) (c).begin(), (c).end()
typedef long long ll;
typedef unsigned long long ull;

#ifdef LOCAL
#define ESC_BLACK "\033[30m"
#define ESC_RED "\033[31m"
#define ESC_GREEN "\033[32m"
#define ESC_YELLOW "\033[33m"
#define ESC_BLUE "\033[34m"
#define ESC_MAGENTA "\033[35m"
#define ESC_CYAN "\033[36m"
#define ESC_WHITE "\033[37m"
#define ESC_DEFAULT "\033[39m"
#define ESC_BG_BLACK "\033[40m"
#define ESC_BG_RED "\033[41m"
#define ESC_BG_GREEN "\033[42m"
#define ESC_BG_YELLOW "\033[43m"
#define ESC_BG_BLUE "\033[44m"
#define ESC_BG_MAGENTA "\033[45m"
#define ESC_BG_CYAN "\033[46m"
#define ESC_BG_WHITE "\033[47m"
#define ESC_BG_DEFAULT "\033[49m"
#define ESC_FT_UNDERBAR "\033[4m"
#define ESC_FT_BOLD "\033[1m"
#define ESC_FT_REVERSE "\033[7m"
#define ESC_FT_CLEAR "\033[0m"
// 画面のクリア
void ESC_CLEAR() {
    cerr << "\033[2J" << flush;
}
// (y行目,x列目)にカーソルを移動
void ESC_MOVE(int y, int x) {
    cerr << "\033[" << y << ";" << x << "H" << flush;
}

// 変数名あり
//#define debug(x) cerr << #x << ": " << (x) << endl;
// 行数あり
#define debug(x) cerr << "L" << __LINE__ << " " << #x << ": " << (x) << endl;
// 色あり
//#define debug(x) cerr << ESC_YELLOW << "L" << __LINE__ << " " << #x << ": " << (x) << ESC_DEFAULT
//<< endl;
// ファイル出力
// ofstream logfs("log.txt");
//#define debug(x) logfs << "L" << __LINE__ << " " << #x << ": " << (x) << endl;

// コンテナ出力
template <class T>
ostream& operator<<(ostream& os, const vector<T>& v) {
    os << "[";
    for (const auto& x : v) os << " " << x;
    os << " ]";
    return os;
}
template <class T>
ostream& operator<<(ostream& os, const vector<vector<T>>& v) {
    // os << "[";
    // for(const auto& e: v) os << " " << e;
    // os << " ]";
    for (size_t i = 0; i < v.size(); i++) {
        os << endl;
        for (size_t j = 0; j < v[i].size(); j++) {
            // os << v[i][j];
            os << setw(3) << v[i][j];
        }
    }
    return os;
}
template <class T>
ostream& operator<<(ostream& os, const set<T>& v) {
    os << "[";
    for (const auto& x : v) os << " " << x;
    os << " ]";
    return os;
}
template <class T, size_t N>
ostream& operator<<(ostream& os, const array<T, N>& v) {
    os << "[";
    for (const auto& x : v) os << " " << x;
    os << " ]";
    return os;
}
template <class T, class U>
ostream& operator<<(ostream& os, const map<T, U>& m) {
    os << "{";
    for (const auto& x : m) os << " " << x.first << ":" << x.second;
    os << " }";
    return os;
}

#else
#define debug(x)
#endif

class Timer {
    std::chrono::system_clock::time_point start_time;
    std::chrono::system_clock::time_point getNow() {
        return std::chrono::system_clock::now();
    }

   public:
    void start() {
        start_time = getNow();
    }
    float getSec() {
        float count =
            std::chrono::duration_cast<std::chrono::microseconds>(getNow() - start_time).count();
        return count / 1e6;
    }
};

uint32_t xor128() {
    static uint32_t x = 123456789, y = 362436069, z = 521288629, w = 88675123;
    uint32_t t;
    t = (x ^ (x << 11));
    x = y;
    y = z;
    z = w;
    return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
}
inline float frand() {
    return xor128() % UINT32_MAX / static_cast<float>(UINT32_MAX);
}

struct P {
    int x, y;
    P() : x(0), y(0) {
    }
    P(int x, int y) : x(x), y(y) {
    }
};
ostream& operator<<(ostream& os, const P& p) {
    os << "(" << p.x << "," << p.y << ")";
    return os;
}

// 座圧
struct CoordComp {
    unordered_map<int, int> z2id;
    vector<int> id2z;

    void add(int x) {
        z2id[x] = 1;
    }
    void init() {
        for (auto& pr : z2id) {
            id2z.push_back(pr.first);
        }
        sort(id2z.begin(), id2z.end());
        for (int i = 0; i < id2z.size(); i++) {
            z2id[id2z[i]] = i;
        }
    }
    int get_id(int x) {
        return z2id[x];
    }
    int get_z(int id) {
        return id2z[id];
    }
};

// 2次元累積和
template <class T>
struct SummedAreaTable {
    int N;
    vector<vector<T>> table;

    SummedAreaTable(int N) : N(N), table(N, vector<T>(N, 0)) {
    }
    void add(int y, int x) {
        table[y][x]++;
    }
    void init() {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                table[i][j] += get(i, j - 1) + get(i - 1, j) - get(i - 1, j - 1);
            }
        }
    }
    // [0,y]と[0,x]の領域の個数を返す
    T get(int y, int x) {
        if (y < 0 || x < 0) return 0;
        if (y >= N) y = N - 1;
        if (x >= N) x = N - 1;
        return table[y][x];
    }
    // [y1,y2)と[x1,x2)の領域の個数を返す
    T get(int y1, int x1, int y2, int x2) {
        return get(y2 - 1, x2 - 1) - get(y1 - 1, x2 - 1) - get(y2 - 1, x1 - 1) +
               get(y1 - 1, x1 - 1);
    }
};

class Solver {
    //
    static constexpr int C_INF = 100000;
    static constexpr int MAXN = 5505;
    static constexpr int MAXD = 10;
    //
    static constexpr float TIME_LIMIT = 2.9;
    static constexpr double START_TEMP = 2000.0;
    static constexpr double END_TEMP = 1e-10;

    Timer timer;
    int N, K;
    vector<int> expect;               // 期待人数
    int expect_sum;                   // 期待人数の合計
    vector<P> ichigo;                 // いちごの情報
    CoordComp comp_x, comp_y;         // 座圧
    SummedAreaTable<uint16_t> table;  // 累積和テーブル

    // 状態
    vector<int> xs, ys;  // 各直線(座圧後のindexを保持)
    vector<int> actual;  // 現在の人数
    ll score;            // 現在のスコア

    // ベスト解
    vector<int> best_xs, best_ys;
    vector<int> best_actual;
    ll best_score;

    void update_score() {
        score = 0;
        ll esum = 0;
        REP(i, 1, 11) {
            esum += (i / 2.5 + 1) * expect[i];
            score += 1000000LL * (i / 2.5 + 1) * min(expect[i], actual[i]);
        }
        score /= esum;
    }

    void init() {
        // 座圧と累積和テーブルのfinalize処理
        comp_x.add(-C_INF);
        comp_x.add(C_INF);
        comp_y.add(-C_INF);
        comp_y.add(C_INF);
        comp_x.init();
        comp_y.init();
        rep(i, N) {
            int zy = comp_y.get_id(ichigo[i].y);
            int zx = comp_x.get_id(ichigo[i].x);
            table.add(zy, zx);
        }
        table.init();

        // 期待人数の合計
        expect_sum = 0;
        REP(i, 1, 11) expect_sum += expect[i];

        // 初期状態の作成
        rep(i, 90) {
            xs.push_back(i * (comp_x.id2z.size() / 90));
        }
        rep(i, 10) {
            ys.push_back(i * (comp_y.id2z.size() / 10));
        }

        REP(i, -1, ys.size()) {
            REP(j, -1, xs.size()) {
                int y1 = (i >= 0) ? ys[i] : -1;
                int x1 = (j >= 0) ? xs[j] : -1;
                int y2 = (i + 1 < ys.size()) ? ys[i + 1] : MAXN + 1;
                int x2 = (j + 1 < xs.size()) ? xs[j + 1] : MAXN + 1;
                uint16_t num = table.get(y1, x1, y2, x2);
                if (1 <= num && num <= 10) {
                    actual[num]++;
                }
            }
        }
        update_score();

        // ベスト解の初期化
        best_score = score;
        best_ys = ys;
        best_xs = xs;
    }

    // 答えの出力
    void output_answer() {
        int k = 0;
        rep(i, best_xs.size()) k++;
        rep(i, best_ys.size()) k++;
        cout << k << endl;
        rep(i, best_xs.size()) {
            cout << comp_x.get_z(best_xs[i]) - 1 << " " << -C_INF << " " << comp_x.get_z(best_xs[i])
                 << " " << C_INF << endl;
        }
        rep(i, best_ys.size()) {
            cout << -C_INF << " " << comp_y.get_z(best_ys[i]) << " " << C_INF << " "
                 << comp_y.get_z(best_ys[i]) - 1 << endl;
        }
    }
    void output_state() {
        int k = 0;
        rep(i, xs.size()) k++;
        rep(i, ys.size()) k++;
        cout << k << endl;
        rep(i, xs.size()) {
            cout << comp_x.get_z(xs[i]) - 1 << " " << -C_INF << " " << comp_x.get_z(xs[i]) << " "
                 << C_INF << endl;
        }
        rep(i, ys.size()) {
            cout << -C_INF << " " << comp_y.get_z(ys[i]) << " " << C_INF << " "
                 << comp_y.get_z(ys[i]) - 1 << endl;
        }
    }

    ////////////////////////////////////////////////////////////////////
    // 近傍、Undo処理
    vector<int> prev_xs, prev_ys;
    vector<int> prev_actual;
    ll prev_score;

    int move_neighbor() {
        prev_xs = xs;
        prev_ys = ys;
        prev_actual = actual;
        prev_score = score;

        int p = xor128() % 100;
        if (p < 96 * 0.9) {  // ずらす:x側を変える
            int r = xor128() % xs.size();
            int d = xor128() % 5 + 1;
            int nx = 0;
            if (xor128() % 2 == 0) {  // 正方向にずらす
                if (r + 1 < xs.size() && xs[r] + d >= xs[r + 1]) return 0;
                if (xs[r] + d >= comp_x.id2z.size()) return 0;
                nx = xs[r] + d;
            } else {  // 負方向にずらす
                if (r - 1 >= 0 && xs[r] - d <= xs[r - 1]) return 0;
                if (xs[r] - d < 0) return 0;
                nx = xs[r] - d;
            }

            REP(i, -1, ys.size()) {
                int y1 = (i >= 0) ? ys[i] : -1;
                int y2 = (i + 1 < ys.size()) ? ys[i + 1] : MAXN + 1;
                int x1 = (r - 1 >= 0) ? xs[r - 1] : -1;
                int x2 = xs[r];
                int x3 = (r + 1 < xs.size()) ? xs[r + 1] : MAXN + 1;

                uint16_t num;
                num = table.get(y1, x1, y2, x2);
                if (1 <= num && num <= 10) {
                    actual[num]--;
                }
                num = table.get(y1, x2, y2, x3);
                if (1 <= num && num <= 10) {
                    actual[num]--;
                }
                num = table.get(y1, x1, y2, nx);
                if (1 <= num && num <= 10) {
                    actual[num]++;
                }
                num = table.get(y1, nx, y2, x3);
                if (1 <= num && num <= 10) {
                    actual[num]++;
                }
            }
            xs[r] = nx;
        } else if (p < 96) {  // ずらす:y側を変える
            int r = xor128() % ys.size();
            int d = xor128() % 5 + 1;
            int ny = 0;
            if (xor128() % 2 == 0) {  // 正方向にずらす
                if (r + 1 < ys.size() && ys[r] + d >= ys[r + 1]) return 0;
                if (ys[r] + d >= comp_y.id2z.size()) return 0;
                ny = ys[r] + d;
            } else {  // 負方向にずらす
                if (r - 1 >= 0 && ys[r] - d <= ys[r - 1]) return 0;
                if (ys[r] - d < 0) return 0;
                ny = ys[r] - d;
            }

            REP(i, -1, xs.size()) {
                int x1 = (i >= 0) ? xs[i] : -1;
                int x2 = (i + 1 < xs.size()) ? xs[i + 1] : MAXN + 1;
                int y1 = (r - 1 >= 0) ? ys[r - 1] : -1;
                int y2 = ys[r];
                int y3 = (r + 1 < ys.size()) ? ys[r + 1] : MAXN + 1;

                uint16_t num;
                num = table.get(y1, x1, y2, x2);
                if (1 <= num && num <= 10) {
                    actual[num]--;
                }
                num = table.get(y2, x1, y3, x2);
                if (1 <= num && num <= 10) {
                    actual[num]--;
                }
                num = table.get(y1, x1, ny, x2);
                if (1 <= num && num <= 10) {
                    actual[num]++;
                }
                num = table.get(ny, x1, y3, x2);
                if (1 <= num && num <= 10) {
                    actual[num]++;
                }
            }
            ys[r] = ny;
        } else if (p < 98) {            // 追加
            if (xor128() % 100 < 60) {  // x側に追加
                if (xs.size() >= 90) return 0;
                int r = xor128() % (xs.size() + 1) - 1;
                int x1 = (r >= 0) ? xs[r] : -1;
                int x3 = (r + 1 < xs.size()) ? xs[r + 1] : comp_x.get_id(C_INF);
                if (x3 - x1 <= 2) return 0;
                int x2 = xor128() % (x3 - (x1 + 1)) + x1 + 1;
                REP(i, -1, ys.size()) {
                    int y1 = (i >= 0) ? ys[i] : -1;
                    int y3 = (i + 1 < ys.size()) ? ys[i + 1] : MAXN + 1;

                    uint16_t num;
                    num = table.get(y1, x1, y3, x3);
                    if (1 <= num && num <= 10) {
                        actual[num]--;
                    }
                    num = table.get(y1, x1, y3, x2);
                    if (1 <= num && num <= 10) {
                        actual[num]++;
                    }
                    num = table.get(y1, x2, y3, x3);
                    if (1 <= num && num <= 10) {
                        actual[num]++;
                    }
                }
                xs.push_back(-1);
                for (int i = xs.size() - 1; i > r + 1; i--) {
                    xs[i] = xs[i - 1];
                }
                xs[r + 1] = x2;
            } else {  // y側に追加
                if (ys.size() >= 10) return 0;
                int r = xor128() % (ys.size() + 1) - 1;
                int y1 = (r >= 0) ? ys[r] : -1;
                int y3 = (r + 1 < ys.size()) ? ys[r + 1] : comp_y.get_id(C_INF);
                if (y3 - y1 <= 2) return 0;
                int y2 = xor128() % (y3 - (y1 + 1)) + y1 + 1;
                REP(i, -1, xs.size()) {
                    int x1 = (i >= 0) ? xs[i] : -1;
                    int x3 = (i + 1 < xs.size()) ? xs[i + 1] : MAXN + 1;

                    uint16_t num;
                    num = table.get(y1, x1, y3, x3);
                    if (1 <= num && num <= 10) {
                        actual[num]--;
                    }
                    num = table.get(y1, x1, y2, x3);
                    if (1 <= num && num <= 10) {
                        actual[num]++;
                    }
                    num = table.get(y2, x1, y3, x3);
                    if (1 <= num && num <= 10) {
                        actual[num]++;
                    }
                }
                ys.push_back(-1);
                for (int i = ys.size() - 1; i > r + 1; i--) {
                    ys[i] = ys[i - 1];
                }
                ys[r + 1] = y2;
            }
        } else {                        // 削除
            if (xor128() % 100 < 60) {  // x側を削除
                if (xs.size() == 1) return 0;
                int r = xor128() % xs.size();
                REP(i, -1, ys.size()) {
                    int y1 = (i >= 0) ? ys[i] : -1;
                    int y2 = (i + 1 < ys.size()) ? ys[i + 1] : MAXN + 1;
                    int x1 = (r - 1 >= 0) ? xs[r - 1] : -1;
                    int x2 = xs[r];
                    int x3 = (r + 1 < xs.size()) ? xs[r + 1] : MAXN + 1;

                    uint16_t num;
                    num = table.get(y1, x1, y2, x2);
                    if (1 <= num && num <= 10) {
                        actual[num]--;
                    }
                    num = table.get(y1, x2, y2, x3);
                    if (1 <= num && num <= 10) {
                        actual[num]--;
                    }
                    num = table.get(y1, x1, y2, x3);
                    if (1 <= num && num <= 10) {
                        actual[num]++;
                    }
                }
                REP(i, r, xs.size() - 1) {
                    xs[i] = xs[i + 1];
                }
                xs.pop_back();
            } else {  // y側を削除
                if (ys.size() == 1) return 0;
                int r = xor128() % ys.size();

                REP(i, -1, xs.size()) {
                    int x1 = (i >= 0) ? xs[i] : -1;
                    int x2 = (i + 1 < xs.size()) ? xs[i + 1] : MAXN + 1;
                    int y1 = (r - 1 >= 0) ? ys[r - 1] : -1;
                    int y2 = ys[r];
                    int y3 = (r + 1 < ys.size()) ? ys[r + 1] : MAXN + 1;

                    uint16_t num;
                    num = table.get(y1, x1, y2, x2);
                    if (1 <= num && num <= 10) {
                        actual[num]--;
                    }
                    num = table.get(y2, x1, y3, x2);
                    if (1 <= num && num <= 10) {
                        actual[num]--;
                    }
                    num = table.get(y1, x1, y3, x2);
                    if (1 <= num && num <= 10) {
                        actual[num]++;
                    }
                }
                REP(i, r, ys.size() - 1) {
                    ys[i] = ys[i + 1];
                }
                ys.pop_back();
            }
        }

        update_score();

        return score - prev_score;
    }

    void move_undo() {
        xs = prev_xs;
        ys = prev_ys;
        actual = prev_actual;
        score = prev_score;
    }
    ////////////////////////////////////////////////////////////////////

    // ベスト解の更新
    void update_best() {
        if (score > best_score) {
            best_score = score;
            best_actual = actual;
            best_ys = ys;
            best_xs = xs;
        }
    }

    // 温度計算
    double calc_temp(double sec) {
        return START_TEMP + (END_TEMP - START_TEMP) * sec / TIME_LIMIT;
    }

   public:
    Solver(int N, int K) : N(N), K(K), expect(MAXD + 1, 0), table(MAXN), actual(MAXD + 1, 0) {
        timer.start();
    }
    void set_expect(int d, int a) {
        expect[d] = a;
    }
    void add_ichigo(int x, int y) {
        ichigo.emplace_back(x, y);
        comp_x.add(x);
        comp_y.add(y);
    }

    ll get_score() const {
        ll ret = 0;
        REP(i, 1, 11) ret += 1000000LL * min(expect[i], best_actual[i]);
        ret /= expect_sum;
        return ret;
    }

    void solve() {
        init();

        float sec;
        float T;
        int step = 0;
        while (true) {
            step++;
            sec = timer.getSec();
            if (sec > TIME_LIMIT) break;
            T = calc_temp(sec);

            bool undo = false;
            int delta = move_neighbor();

            if (delta < 0) {
                if (exp(delta / T) >= frand()) {
                    ;
                } else {
                    undo = true;
                }
            }
            if (undo) {
                move_undo();
            } else {
                update_best();
            }

            /*
            if (step % 100000 == 1) {
                cerr << "score"
                     << "\t" << score << endl;
                // debug(actual);
                output_state();
            }
            */
        }
        debug(step);
        debug(best_score);
        output_answer();
    }
};

int main() {
    int N, K;
    cin >> N >> K;

    Solver solver(N, K);

    rep(i, 10) {
        int a;
        cin >> a;
        solver.set_expect(i + 1, a);
    }
    vector<P> ichigo(N);

    rep(i, N) {
        int x, y;
        cin >> x >> y;
        solver.add_ichigo(x, y);
    }

    solver.solve();

    cerr << solver.get_score() << endl;

    return 0;
}

Submission Info

Submission Time
Task A - AtCoder 10th Anniversary
User phyllo
Language C++ (GCC 9.2.1)
Score 99600505
Code Size 20217 Byte
Status AC
Exec Time 2953 ms
Memory 63564 KiB

Compile Error

./Main.cpp: In member function ‘void CoordComp::init()’:
./Main.cpp:160:27: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  160 |         for (int i = 0; i < id2z.size(); i++) {
      |                         ~~^~~~~~~~~~~~~
./Main.cpp: In member function ‘void Solver::init()’:
./Main.cpp:273:33: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  273 |                 int y2 = (i + 1 < ys.size()) ? ys[i + 1] : MAXN + 1;
      |                           ~~~~~~^~~~~~~~~~~
./Main.cpp:274:33: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  274 |                 int x2 = (j + 1 < xs.size()) ? xs[j + 1] : MAXN + 1;
      |                           ~~~~~~^~~~~~~~~~~
./Main.cpp: In member function ‘int Solver::move_neighbor()’:
./Main.cpp:337:27: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  337 |                 if (r + 1 < xs.size() && xs[r] + d >= xs[r + 1]) return 0;
      |                     ~~~~~~^~~~~~~~~~~
./Main.cpp:338:31: warning: comparison of integer expressions of different signedness: ‘__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type’ {aka ‘int’} and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  338 |                 if (xs[r] + d >= comp_x.id2z.size()) return 0;
./Main.cpp:348:33: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  348 |                 int y2 = (i + 1 < ys.size()) ? ys[i + 1] : MAXN + 1;
      |                           ~~~~~~^~~~~~~~~~~
./Ma...

Judge Result

Set Name test_ALL
Score / Max Score 99600505 / 100000000
Status
AC × 100
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
Case Name Status Exec Time Memory
test_0000.txt AC 2953 ms 63356 KiB
test_0001.txt AC 2946 ms 63340 KiB
test_0002.txt AC 2944 ms 63320 KiB
test_0003.txt AC 2942 ms 63316 KiB
test_0004.txt AC 2947 ms 63280 KiB
test_0005.txt AC 2942 ms 63504 KiB
test_0006.txt AC 2947 ms 63256 KiB
test_0007.txt AC 2947 ms 63404 KiB
test_0008.txt AC 2947 ms 63180 KiB
test_0009.txt AC 2944 ms 63456 KiB
test_0010.txt AC 2945 ms 63436 KiB
test_0011.txt AC 2942 ms 63312 KiB
test_0012.txt AC 2941 ms 63432 KiB
test_0013.txt AC 2950 ms 63140 KiB
test_0014.txt AC 2947 ms 63448 KiB
test_0015.txt AC 2947 ms 63360 KiB
test_0016.txt AC 2946 ms 63300 KiB
test_0017.txt AC 2945 ms 63216 KiB
test_0018.txt AC 2946 ms 63560 KiB
test_0019.txt AC 2946 ms 63492 KiB
test_0020.txt AC 2946 ms 63272 KiB
test_0021.txt AC 2946 ms 63212 KiB
test_0022.txt AC 2947 ms 63204 KiB
test_0023.txt AC 2945 ms 63408 KiB
test_0024.txt AC 2945 ms 63208 KiB
test_0025.txt AC 2942 ms 63428 KiB
test_0026.txt AC 2947 ms 63300 KiB
test_0027.txt AC 2945 ms 63284 KiB
test_0028.txt AC 2942 ms 63564 KiB
test_0029.txt AC 2945 ms 63332 KiB
test_0030.txt AC 2945 ms 63504 KiB
test_0031.txt AC 2942 ms 63372 KiB
test_0032.txt AC 2946 ms 63320 KiB
test_0033.txt AC 2947 ms 63268 KiB
test_0034.txt AC 2947 ms 63232 KiB
test_0035.txt AC 2946 ms 63372 KiB
test_0036.txt AC 2946 ms 63404 KiB
test_0037.txt AC 2947 ms 63232 KiB
test_0038.txt AC 2947 ms 63312 KiB
test_0039.txt AC 2944 ms 63380 KiB
test_0040.txt AC 2949 ms 63372 KiB
test_0041.txt AC 2950 ms 63300 KiB
test_0042.txt AC 2946 ms 63276 KiB
test_0043.txt AC 2944 ms 63404 KiB
test_0044.txt AC 2945 ms 63432 KiB
test_0045.txt AC 2947 ms 63448 KiB
test_0046.txt AC 2949 ms 63244 KiB
test_0047.txt AC 2947 ms 63436 KiB
test_0048.txt AC 2941 ms 63408 KiB
test_0049.txt AC 2946 ms 63332 KiB
test_0050.txt AC 2943 ms 63316 KiB
test_0051.txt AC 2943 ms 63424 KiB
test_0052.txt AC 2949 ms 63292 KiB
test_0053.txt AC 2946 ms 63424 KiB
test_0054.txt AC 2947 ms 63280 KiB
test_0055.txt AC 2948 ms 63376 KiB
test_0056.txt AC 2947 ms 63260 KiB
test_0057.txt AC 2946 ms 63196 KiB
test_0058.txt AC 2946 ms 63348 KiB
test_0059.txt AC 2948 ms 63308 KiB
test_0060.txt AC 2945 ms 63316 KiB
test_0061.txt AC 2949 ms 63464 KiB
test_0062.txt AC 2947 ms 63328 KiB
test_0063.txt AC 2948 ms 63320 KiB
test_0064.txt AC 2945 ms 63360 KiB
test_0065.txt AC 2945 ms 63492 KiB
test_0066.txt AC 2945 ms 63360 KiB
test_0067.txt AC 2945 ms 63440 KiB
test_0068.txt AC 2949 ms 63452 KiB
test_0069.txt AC 2946 ms 63432 KiB
test_0070.txt AC 2944 ms 63148 KiB
test_0071.txt AC 2945 ms 63324 KiB
test_0072.txt AC 2949 ms 63276 KiB
test_0073.txt AC 2946 ms 63232 KiB
test_0074.txt AC 2948 ms 63344 KiB
test_0075.txt AC 2947 ms 63264 KiB
test_0076.txt AC 2947 ms 63316 KiB
test_0077.txt AC 2946 ms 63324 KiB
test_0078.txt AC 2947 ms 63428 KiB
test_0079.txt AC 2950 ms 63264 KiB
test_0080.txt AC 2943 ms 63276 KiB
test_0081.txt AC 2945 ms 63352 KiB
test_0082.txt AC 2945 ms 63456 KiB
test_0083.txt AC 2946 ms 63280 KiB
test_0084.txt AC 2949 ms 63388 KiB
test_0085.txt AC 2948 ms 63504 KiB
test_0086.txt AC 2944 ms 63276 KiB
test_0087.txt AC 2946 ms 63464 KiB
test_0088.txt AC 2946 ms 63292 KiB
test_0089.txt AC 2947 ms 63324 KiB
test_0090.txt AC 2947 ms 63384 KiB
test_0091.txt AC 2949 ms 63308 KiB
test_0092.txt AC 2946 ms 63516 KiB
test_0093.txt AC 2947 ms 63256 KiB
test_0094.txt AC 2948 ms 63400 KiB
test_0095.txt AC 2946 ms 63284 KiB
test_0096.txt AC 2945 ms 63260 KiB
test_0097.txt AC 2949 ms 63496 KiB
test_0098.txt AC 2945 ms 63468 KiB
test_0099.txt AC 2949 ms 63420 KiB