Submission #71292134


Source Code Expand

// greedy_length_pref_merge.cpp
// Python 実装を忠実に C++ に翻訳したもの
#include <bits/stdc++.h>
using namespace std;

struct UF {
    int n;
    vector<int> p, rankv;
    UF(int n=0): n(n), p(n), rankv(n,0) { for (int i=0;i<n;i++) p[i]=i; }
    int find(int x){
        while (p[x] != x) {
            p[x] = p[p[x]];
            x = p[x];
        }
        return x;
    }
    int unite(int a, int b){
        int ra = find(a), rb = find(b);
        if (ra == rb) return ra;
        if (rankv[ra] < rankv[rb]) swap(ra, rb);
        p[rb] = ra;
        if (rankv[ra] == rankv[rb]) rankv[ra] ++;
        return ra;
    }
};

// utilities
inline double torus_dx(double a, double b, int L){
    double d = fabs(a - b);
    return (d <= L - d) ? d : (L - d);
}
inline double torus_dist2_xy(double ax, double ay, double bx, double by, int L){
    double dx = torus_dx(ax, bx, L);
    double dy = torus_dx(ay, by, L);
    return dx*dx + dy*dy;
}

// subset-sum reconstruct indices (returns vector of indices into given sizes), or empty if no solution
vector<int> find_subset_sum_indices(const vector<int>& sizes, int target){
    if (target < 0) return {};
    int m = (int)sizes.size();
    vector<int> dp(target+1, -1);
    vector<int> prev(target+1, -1);
    dp[0] = -2; // marker
    for (int idx=0; idx<m; ++idx){
        int sz = sizes[idx];
        if (sz > target) continue;
        for (int s=target; s>=sz; --s){
            if (dp[s] == -1 && dp[s - sz] != -1){
                dp[s] = idx;
                prev[s] = s - sz;
                if (s == target){
                    vector<int> res;
                    int cur = s;
                    while (cur != 0){
                        int i = dp[cur];
                        res.push_back(i);
                        cur = prev[cur];
                    }
                    return res;
                }
            }
        }
    }
    return {};
}

// pack components into M groups of sum K each. comp_list: tuple(root, members, size)
using CompItem = tuple<int, vector<int>, int>;
vector<vector<int>> pack_components_into_M_groups(const vector<CompItem>& comp_list, int M, int K, int attempts=200){
    int n = (int)comp_list.size();
    vector<int> sizes(n);
    for (int i=0;i<n;i++) sizes[i] = get<2>(comp_list[i]);
    vector<int> order(n);
    iota(order.begin(), order.end(), 0);
    sort(order.begin(), order.end(), [&](int a, int b){ return sizes[a] > sizes[b]; });

    // try deterministic greedy Best-Fit-Decreasing
    vector<vector<int>> groups(M);
    vector<int> gsum(M,0);
    bool ok_greedy = true;
    for (int idx : order){
        int sz = sizes[idx];
        int best_g = -1; int best_space = INT_MAX;
        for (int g = 0; g < M; ++g){
            int rem = K - (gsum[g] + sz);
            if (rem >= 0 && rem < best_space){
                best_space = rem;
                best_g = g;
            }
        }
        if (best_g == -1) { ok_greedy = false; break; }
        groups[best_g].push_back(idx);
        gsum[best_g] += sz;
    }
    if (ok_greedy){
        bool allK = true;
        for (int s: gsum) if (s != K) { allK = false; break; }
        if (allK) return groups;
    }

    // fallback DP repeated
    auto try_order = [&](const vector<int>& ord)->vector<vector<int>>{
        unordered_set<int> remaining(ord.begin(), ord.end());
        vector<vector<int>> gres;
        for (int g=0; g<M; ++g){
            vector<int> rem_list(remaining.begin(), remaining.end());
            vector<int> rem_sizes;
            rem_sizes.reserve(rem_list.size());
            for (int idx : rem_list) rem_sizes.push_back(sizes[idx]);
            vector<int> subset = find_subset_sum_indices(rem_sizes, K);
            if (subset.empty()) return {};
            vector<int> chosen;
            chosen.reserve(subset.size());
            for (int id : subset){
                chosen.push_back(rem_list[id]);
            }
            for (int c : chosen) remaining.erase(c);
            gres.push_back(chosen);
        }
        if (!remaining.empty()) return {};
        return gres;
    };

    vector<int> ord = order;
    vector<vector<int>> g = try_order(ord);
    if (!g.empty()) return g;
    // randomized attempts
    std::mt19937 rng((unsigned)chrono::high_resolution_clock::now().time_since_epoch().count());
    for (int a=0; a<attempts; ++a){
        shuffle(ord.begin(), ord.end(), rng);
        g = try_order(ord);
        if (!g.empty()) return g;
    }
    return {};
}

// Prim MST (returns list of edges connecting indices)
vector<pair<int,int>> prim_mst_indices(const vector<int>& indices, const vector<pair<double,double>>& pos, int L){
    int K = (int)indices.size();
    vector<pair<int,int>> edges;
    if (K <= 1) return edges;
    vector<char> in_mst(K, 0);
    vector<double> dist(K, 1e300);
    vector<int> parent(K, -1);
    dist[0] = 0.0;
    for (int it=0; it<K; ++it){
        int u = -1; double best = 1e300;
        for (int i=0;i<K;i++){
            if (!in_mst[i] && dist[i] < best){ best = dist[i]; u = i; }
        }
        if (u == -1) break;
        in_mst[u] = 1;
        if (parent[u] != -1){
            edges.emplace_back(indices[u], indices[parent[u]]);
        }
        auto pu = pos[indices[u]];
        for (int v=0; v<K; ++v){
            if (in_mst[v]) continue;
            auto pv = pos[indices[v]];
            double d = torus_dist2_xy(pu.first, pu.second, pv.first, pv.second, L);
            if (d < dist[v]){ dist[v] = d; parent[v] = u; }
        }
    }
    return edges;
}

// read input
bool read_input(int &N, int &T, int &M, int &K, int &L, vector<pair<double,double>>& pts, vector<pair<double,double>>& vels){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    if (!(cin >> N >> T >> M >> K >> L)) return false;
    pts.assign(N, {0.0,0.0});
    vels.assign(N, {0.0,0.0});
    for (int i=0;i<N;i++){
        int x,y,vx,vy;
        cin >> x >> y >> vx >> vy;
        pts[i].first = (double)x; pts[i].second = (double)y;
        vels[i].first = (double)vx; vels[i].second = (double)vy;
    }
    return true;
}

// main greedy implementation (faithful to Python)
vector<tuple<int,int,int>> greedy_length_pref_merge(int N, int T, int M, int K, int L,
    vector<pair<double,double>>& pts, vector<pair<double,double>>& vels, double THRESH, int NEIGHBORS)
{
    UF uf(N);
    unordered_map<int, pair<double,double>> vel;
    unordered_map<int, int> size;
    vel.reserve(N*2);
    size.reserve(N*2);
    for (int i=0;i<N;i++){
        vel[i] = vels[i];
        size[i] = 1;
    }
    vector<tuple<int,int,int>> merges;
    int merges_needed = N - M;
    bool use_thr = !(std::isnan(THRESH));
    double thr2 = use_thr ? THRESH*THRESH : -1.0;

    auto current_components = [&](void)->unordered_map<int, vector<int>>{
        unordered_map<int, vector<int>> comp;
        comp.reserve(N/2+10);
        for (int i=0;i<N;i++){
            int r = uf.find(i);
            comp[r].push_back(i);
        }
        return comp;
    };

    for (int t=0; t<T; ++t){
        if ((int)merges.size() >= merges_needed) break;

        auto comp = current_components();
        vector<int> roots;
        roots.reserve(comp.size());
        for (auto &kv : comp) roots.push_back(kv.first);

        // candidate list
        struct Cand { double d2; int ra, rb, ai, bi; };
        vector<Cand> candidates;
        candidates.reserve(roots.size() * (size_t)min((int)roots.size(), NEIGHBORS));
        unordered_set<long long> seen;

        for (int ra : roots){
            auto &A = comp[ra];
            vector<Cand> dlist;
            dlist.reserve(roots.size());
            int sa = size.count(ra) ? size[ra] : (int)A.size();
            for (int rb : roots){
                if (rb == ra) continue;
                int sb = size.count(rb) ? size[rb] : (int)comp[rb].size();
                if (sa + sb > K) continue;
                auto &B = comp[rb];
                double min_d2 = 1e300;
                int besta=-1, bestb=-1;
                if (A.size() <= B.size()){
                    for (int a : A){
                        double ax = pts[a].first, ay = pts[a].second;
                        for (int b : B){
                            double bx = pts[b].first, by = pts[b].second;
                            double d2 = torus_dist2_xy(ax, ay, bx, by, L);
                            if (d2 < min_d2){ min_d2 = d2; besta = a; bestb = b; if (min_d2 <= 0.0) break; }
                        }
                        if (min_d2 <= 0.0) break;
                    }
                } else {
                    for (int b : B){
                        double bx = pts[b].first, by = pts[b].second;
                        for (int a : A){
                            double ax = pts[a].first, ay = pts[a].second;
                            double d2 = torus_dist2_xy(ax, ay, bx, by, L);
                            if (d2 < min_d2){ min_d2 = d2; besta = a; bestb = b; if (min_d2 <= 0.0) break; }
                        }
                        if (min_d2 <= 0.0) break;
                    }
                }
                if (use_thr && min_d2 > thr2) continue;
                dlist.push_back({min_d2, ra, rb, besta, bestb});
            }
            if (dlist.empty()) continue;
            sort(dlist.begin(), dlist.end(), [](const Cand &a, const Cand &b){ return a.d2 < b.d2; });
            int limit = min((int)dlist.size(), NEIGHBORS);
            for (int i=0;i<limit;i++){
                const Cand &it = dlist[i];
                int a = it.ra, b = it.rb;
                int x = min(a,b), y = max(a,b);
                long long key = ((long long)x<<32) ^ (long long)y;
                if (seen.find(key) != seen.end()) continue;
                seen.insert(key);
                candidates.push_back(it);
            }
        }

        sort(candidates.begin(), candidates.end(), [](const Cand &a, const Cand &b){
            if (a.d2 != b.d2) return a.d2 < b.d2;
            if (a.ra != b.ra) return a.ra < b.ra;
            return a.rb < b.rb;
        });

        for (auto &c : candidates){
            if ((int)merges.size() >= merges_needed) break;
            int ra = c.ra, rb = c.rb;
            int ia = c.ai, ib = c.bi;
            int r_a = uf.find(ra), r_b = uf.find(rb);
            if (r_a == r_b) continue;
            int sa = size.count(r_a) ? size[r_a] : (int)comp[r_a].size();
            int sb = size.count(r_b) ? size[r_b] : (int)comp[r_b].size();
            if (sa + sb > K) continue;

            int long_root, short_root, long_point, short_point;
            int s_long, s_short;
            if (sa >= sb){ long_root = r_a; short_root = r_b; long_point = ia; short_point = ib; s_long = sa; s_short = sb; }
            else { long_root = r_b; short_root = r_a; long_point = ib; short_point = ia; s_long = sb; s_short = sa; }

            // short-side alternative check
            bool has_better_alt = false;
            if (use_thr){
                auto comp_now = current_components();
                double sx = pts[short_point].first, sy = pts[short_point].second;
                for (auto &kv : comp_now){
                    int r_other = kv.first;
                    if (r_other == long_root || r_other == short_root) continue;
                    int size_other = size.count(r_other) ? size[r_other] : (int)kv.second.size();
                    if (size_other >= s_long) continue;
                    for (int m : kv.second){
                        double mx = pts[m].first, my = pts[m].second;
                        if (torus_dist2_xy(sx, sy, mx, my, L) <= thr2){ has_better_alt = true; break; }
                    }
                    if (has_better_alt) break;
                }
            } else {
                auto comp_now = current_components();
                double sx = pts[short_point].first, sy = pts[short_point].second;
                vector<pair<double,int>> nearest_comps;
                nearest_comps.reserve(comp_now.size());
                for (auto &kv : comp_now){
                    int r_other = kv.first;
                    if (r_other == long_root || r_other == short_root) continue;
                    int size_other = size.count(r_other) ? size[r_other] : (int)kv.second.size();
                    if (size_other >= s_long) continue;
                    double md = 1e300;
                    for (int m : kv.second){
                        double d2 = torus_dist2_xy(sx, sy, pts[m].first, pts[m].second, L);
                        if (d2 < md) md = d2;
                    }
                    nearest_comps.emplace_back(md, r_other);
                }
                if (!nearest_comps.empty()){
                    sort(nearest_comps.begin(), nearest_comps.end());
                    if (nearest_comps[0].first < c.d2 - 1e-9) has_better_alt = true;
                }
            }
            if (has_better_alt) continue;

            // packing check
            auto comp_now = current_components();
            vector<CompItem> comp_items;
            comp_items.reserve(comp_now.size());
            for (auto &kv : comp_now){
                int root = kv.first;
                if (root == r_a || root == r_b) continue;
                int s = size.count(root) ? size[root] : (int)kv.second.size();
                comp_items.emplace_back(root, kv.second, s);
            }
            vector<int> merged_members = comp[r_a];
            auto &v2 = comp[r_b];
            merged_members.insert(merged_members.end(), v2.begin(), v2.end());
            comp_items.emplace_back(-1, merged_members, sa + sb);
            bool bad=false;
            for (auto &it : comp_items){
                if (get<2>(it) > K){ bad = true; break; }
            }
            if (bad) continue;
            auto pack = pack_components_into_M_groups(comp_items, M, K, 50);
            if (pack.empty()) continue;

            // accept merge
            merges.emplace_back(t, long_point, short_point);
            int ra_root = uf.find(long_point), rb_root = uf.find(short_point);
            if (ra_root != rb_root){
                int sa2 = size.count(ra_root) ? size[ra_root] : 1;
                int sb2 = size.count(rb_root) ? size[rb_root] : 1;
                auto vxa_vya = vel.count(ra_root) ? vel[ra_root] : vels[ra_root];
                auto vxb_vyb = vel.count(rb_root) ? vel[rb_root] : vels[rb_root];
                int newroot = uf.unite(ra_root, rb_root);
                int newsize = sa2 + sb2;
                double newvx = (sa2 * vxa_vya.first + sb2 * vxb_vyb.first) / (double)newsize;
                double newvy = (sa2 * vxa_vya.second + sb2 * vxb_vyb.second) / (double)newsize;
                vel[newroot] = {newvx, newvy};
                size[newroot] = newsize;
                if (newroot != ra_root){ vel.erase(ra_root); size.erase(ra_root); }
                if (newroot != rb_root){ vel.erase(rb_root); size.erase(rb_root); }
            }
        }

        // movement phase
        for (int i=0;i<N;i++){
            int r = uf.find(i);
            auto it = vel.find(r);
            double vx, vy;
            if (it != vel.end()){ vx = it->second.first; vy = it->second.second; }
            else { vx = vels[i].first; vy = vels[i].second; }
            double nx = pts[i].first + vx;
            double ny = pts[i].second + vy;
            // normalize 0<= < L
            nx = fmod(nx, (double)L); if (nx < 0) nx += L;
            ny = fmod(ny, (double)L); if (ny < 0) ny += L;
            pts[i].first = nx; pts[i].second = ny;
        }
    }

    // final packing if needed at t=T-1
    if ((int)merges.size() < merges_needed){
        auto comp_now = current_components();
        vector<CompItem> comp_items;
        comp_items.reserve(comp_now.size());
        for (auto &kv : comp_now){
            int root = kv.first;
            int s = size.count(root) ? size[root] : (int)kv.second.size();
            comp_items.emplace_back(root, kv.second, s);
        }
        auto pack = pack_components_into_M_groups(comp_items, M, K, 500);
        if (pack.empty()){
            // fallback naive merging
            vector<int> roots;
            for (auto &kv: comp_now) roots.push_back(kv.first);
            while ((int)merges.size() < merges_needed && (int)roots.size() >= 2){
                int a = roots.front(); roots.erase(roots.begin());
                int b = roots.front(); roots.erase(roots.begin());
                auto &A = comp_now[a]; auto &B = comp_now[b];
                double bestd = 1e300; pair<int,int> bestpair = {A[0], B[0]};
                for (int x : A){
                    for (int y : B){
                        double d2 = torus_dist2_xy(pts[x].first, pts[x].second, pts[y].first, pts[y].second, L);
                        if (d2 < bestd){ bestd = d2; bestpair = {x,y}; }
                    }
                }
                merges.emplace_back(max(0, T-1), bestpair.first, bestpair.second);
                uf.unite(bestpair.first, bestpair.second);
                comp_now = current_components();
                roots.clear();
                for (auto &kv : comp_now) roots.push_back(kv.first);
            }
        } else {
            // connect components within each packed group by nearest merges at t=T-1
            // comp_items index -> comp_items[idx].first is root id
            for (const auto &group : pack){
                vector<int> subs;
                subs.reserve(group.size());
                for (int idx : group) subs.push_back(get<0>(comp_items[idx]));
                comp_now = current_components();
                while ((int)subs.size() > 1 && (int)merges.size() < merges_needed){
                    double bestd = 1e300; pair<int,int> bestpair = {-1,-1};
                    pair<int,int> best_roots = {-1,-1};
                    for (size_t i=0;i<subs.size();++i){
                        int ri = subs[i];
                        auto Ai_it = comp_now.find(ri);
                        if (Ai_it == comp_now.end()) continue;
                        auto &Ai = Ai_it->second;
                        for (size_t j=i+1;j<subs.size();++j){
                            int rj = subs[j];
                            auto Bj_it = comp_now.find(rj);
                            if (Bj_it == comp_now.end()) continue;
                            auto &Bj = Bj_it->second;
                            for (int a : Ai){
                                for (int b : Bj){
                                    double d2 = torus_dist2_xy(pts[a].first, pts[a].second, pts[b].first, pts[b].second, L);
                                    if (d2 < bestd){ bestd = d2; bestpair = {a,b}; best_roots = {ri,rj}; }
                                }
                            }
                        }
                    }
                    if (bestpair.first == -1) break;
                    merges.emplace_back(max(0, T-1), bestpair.first, bestpair.second);
                    uf.unite(bestpair.first, bestpair.second);
                    comp_now = current_components();
                    // filter subs to only roots still representatives
                    vector<int> new_subs;
                    for (int r : subs) if (uf.find(r) == r) new_subs.push_back(r);
                    subs.swap(new_subs);
                }
            }
        }
    }

    return merges;
}

int main(int argc, char** argv){
    double THRESH = 2000.0;
    int NEIGHBORS = 5;
    if (argc >= 2){
        string s = argv[1];
        if (s == "None" || s == "null" || s == "none" || s == "NULL") THRESH = numeric_limits<double>::quiet_NaN();
        else {
            try { THRESH = stod(s); } catch(...) { THRESH = numeric_limits<double>::quiet_NaN(); }
        }
    }
    if (argc >= 3){
        try { NEIGHBORS = stoi(argv[2]); } catch(...) { NEIGHBORS = 5; }
    }

    int N, T, M, K, L;
    vector<pair<double,double>> pts, vels;
    if (!read_input(N, T, M, K, L, pts, vels)) return 0;

    vector<tuple<int,int,int>> merges = greedy_length_pref_merge(N,T,M,K,L,pts,vels,THRESH,NEIGHBORS);
    int need = N - M;
    int cnt = 0;
    for (auto &m : merges){
        if (cnt >= need) break;
        int t,i,j;
        tie(t,i,j) = m;
        cout << t << " " << i << " " << j << "\n";
        cnt++;
    }

    return 0;
}

Submission Info

Submission Time
Task A - Molecules
User sukesann
Language C++23 (GCC 15.2.0)
Score 729513654
Code Size 20827 Byte
Status AC
Exec Time 589 ms
Memory 3948 KiB

Compile Error

./Main.cpp: In function 'std::vector<std::tuple<int, int, int> > greedy_length_pref_merge(int, int, int, int, int, std::vector<std::pair<double, double> >&, std::vector<std::pair<double, double> >&, double, int)':
./Main.cpp:293:25: warning: variable 's_short' set but not used [-Wunused-but-set-variable]
  293 |             int s_long, s_short;
      |                         ^~~~~~~

Judge Result

Set Name test_ALL
Score / Max Score 729513654 / 1500000000000
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 542 ms 3728 KiB
test_0001.txt AC 428 ms 3780 KiB
test_0002.txt AC 489 ms 3828 KiB
test_0003.txt AC 498 ms 3812 KiB
test_0004.txt AC 483 ms 3848 KiB
test_0005.txt AC 476 ms 3828 KiB
test_0006.txt AC 480 ms 3748 KiB
test_0007.txt AC 459 ms 3804 KiB
test_0008.txt AC 473 ms 3796 KiB
test_0009.txt AC 509 ms 3888 KiB
test_0010.txt AC 456 ms 3884 KiB
test_0011.txt AC 533 ms 3752 KiB
test_0012.txt AC 495 ms 3788 KiB
test_0013.txt AC 528 ms 3896 KiB
test_0014.txt AC 543 ms 3896 KiB
test_0015.txt AC 442 ms 3744 KiB
test_0016.txt AC 450 ms 3852 KiB
test_0017.txt AC 527 ms 3748 KiB
test_0018.txt AC 492 ms 3728 KiB
test_0019.txt AC 496 ms 3804 KiB
test_0020.txt AC 493 ms 3744 KiB
test_0021.txt AC 491 ms 3836 KiB
test_0022.txt AC 492 ms 3912 KiB
test_0023.txt AC 493 ms 3848 KiB
test_0024.txt AC 485 ms 3896 KiB
test_0025.txt AC 503 ms 3944 KiB
test_0026.txt AC 487 ms 3864 KiB
test_0027.txt AC 508 ms 3832 KiB
test_0028.txt AC 514 ms 3764 KiB
test_0029.txt AC 519 ms 3744 KiB
test_0030.txt AC 500 ms 3748 KiB
test_0031.txt AC 527 ms 3896 KiB
test_0032.txt AC 447 ms 3888 KiB
test_0033.txt AC 534 ms 3784 KiB
test_0034.txt AC 513 ms 3784 KiB
test_0035.txt AC 465 ms 3740 KiB
test_0036.txt AC 506 ms 3932 KiB
test_0037.txt AC 497 ms 3828 KiB
test_0038.txt AC 470 ms 3848 KiB
test_0039.txt AC 476 ms 3884 KiB
test_0040.txt AC 537 ms 3868 KiB
test_0041.txt AC 527 ms 3796 KiB
test_0042.txt AC 525 ms 3788 KiB
test_0043.txt AC 427 ms 3848 KiB
test_0044.txt AC 473 ms 3888 KiB
test_0045.txt AC 494 ms 3748 KiB
test_0046.txt AC 460 ms 3796 KiB
test_0047.txt AC 460 ms 3728 KiB
test_0048.txt AC 518 ms 3944 KiB
test_0049.txt AC 465 ms 3740 KiB
test_0050.txt AC 529 ms 3788 KiB
test_0051.txt AC 492 ms 3832 KiB
test_0052.txt AC 490 ms 3944 KiB
test_0053.txt AC 477 ms 3848 KiB
test_0054.txt AC 514 ms 3804 KiB
test_0055.txt AC 451 ms 3728 KiB
test_0056.txt AC 478 ms 3740 KiB
test_0057.txt AC 494 ms 3868 KiB
test_0058.txt AC 472 ms 3744 KiB
test_0059.txt AC 468 ms 3896 KiB
test_0060.txt AC 442 ms 3896 KiB
test_0061.txt AC 412 ms 3796 KiB
test_0062.txt AC 527 ms 3944 KiB
test_0063.txt AC 589 ms 3832 KiB
test_0064.txt AC 518 ms 3788 KiB
test_0065.txt AC 476 ms 3888 KiB
test_0066.txt AC 485 ms 3740 KiB
test_0067.txt AC 522 ms 3788 KiB
test_0068.txt AC 542 ms 3740 KiB
test_0069.txt AC 558 ms 3868 KiB
test_0070.txt AC 439 ms 3944 KiB
test_0071.txt AC 574 ms 3812 KiB
test_0072.txt AC 472 ms 3744 KiB
test_0073.txt AC 517 ms 3776 KiB
test_0074.txt AC 467 ms 3704 KiB
test_0075.txt AC 470 ms 3900 KiB
test_0076.txt AC 506 ms 3804 KiB
test_0077.txt AC 501 ms 3892 KiB
test_0078.txt AC 514 ms 3744 KiB
test_0079.txt AC 569 ms 3860 KiB
test_0080.txt AC 431 ms 3912 KiB
test_0081.txt AC 557 ms 3912 KiB
test_0082.txt AC 473 ms 3832 KiB
test_0083.txt AC 454 ms 3744 KiB
test_0084.txt AC 513 ms 3848 KiB
test_0085.txt AC 492 ms 3948 KiB
test_0086.txt AC 487 ms 3932 KiB
test_0087.txt AC 482 ms 3728 KiB
test_0088.txt AC 508 ms 3728 KiB
test_0089.txt AC 497 ms 3748 KiB
test_0090.txt AC 528 ms 3744 KiB
test_0091.txt AC 527 ms 3896 KiB
test_0092.txt AC 456 ms 3788 KiB
test_0093.txt AC 434 ms 3740 KiB
test_0094.txt AC 456 ms 3848 KiB
test_0095.txt AC 506 ms 3832 KiB
test_0096.txt AC 497 ms 3848 KiB
test_0097.txt AC 492 ms 3888 KiB
test_0098.txt AC 431 ms 3804 KiB
test_0099.txt AC 476 ms 3932 KiB
test_0100.txt AC 534 ms 3748 KiB
test_0101.txt AC 517 ms 3728 KiB
test_0102.txt AC 460 ms 3788 KiB
test_0103.txt AC 482 ms 3944 KiB
test_0104.txt AC 504 ms 3788 KiB
test_0105.txt AC 487 ms 3888 KiB
test_0106.txt AC 475 ms 3748 KiB
test_0107.txt AC 530 ms 3828 KiB
test_0108.txt AC 497 ms 3744 KiB
test_0109.txt AC 538 ms 3896 KiB
test_0110.txt AC 478 ms 3848 KiB
test_0111.txt AC 498 ms 3812 KiB
test_0112.txt AC 449 ms 3848 KiB
test_0113.txt AC 516 ms 3852 KiB
test_0114.txt AC 473 ms 3728 KiB
test_0115.txt AC 582 ms 3744 KiB
test_0116.txt AC 488 ms 3744 KiB
test_0117.txt AC 513 ms 3816 KiB
test_0118.txt AC 527 ms 3796 KiB
test_0119.txt AC 457 ms 3784 KiB
test_0120.txt AC 542 ms 3848 KiB
test_0121.txt AC 435 ms 3812 KiB
test_0122.txt AC 496 ms 3828 KiB
test_0123.txt AC 467 ms 3868 KiB
test_0124.txt AC 420 ms 3728 KiB
test_0125.txt AC 505 ms 3788 KiB
test_0126.txt AC 459 ms 3744 KiB
test_0127.txt AC 533 ms 3704 KiB
test_0128.txt AC 462 ms 3848 KiB
test_0129.txt AC 469 ms 3728 KiB
test_0130.txt AC 439 ms 3884 KiB
test_0131.txt AC 555 ms 3728 KiB
test_0132.txt AC 500 ms 3744 KiB
test_0133.txt AC 456 ms 3708 KiB
test_0134.txt AC 493 ms 3788 KiB
test_0135.txt AC 498 ms 3896 KiB
test_0136.txt AC 475 ms 3748 KiB
test_0137.txt AC 469 ms 3828 KiB
test_0138.txt AC 522 ms 3896 KiB
test_0139.txt AC 461 ms 3744 KiB
test_0140.txt AC 475 ms 3804 KiB
test_0141.txt AC 476 ms 3868 KiB
test_0142.txt AC 495 ms 3744 KiB
test_0143.txt AC 467 ms 3776 KiB
test_0144.txt AC 480 ms 3944 KiB
test_0145.txt AC 497 ms 3728 KiB
test_0146.txt AC 510 ms 3728 KiB
test_0147.txt AC 548 ms 3692 KiB
test_0148.txt AC 445 ms 3804 KiB
test_0149.txt AC 479 ms 3884 KiB