Submission #1014118

# Submission time Handle Problem Language Result Execution time Memory
1014118 2024-07-04T11:22:17 Z c2zi6 Mechanical Doll (IOI18_doll) C++14
62 / 100
64 ms 17320 KB
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define all(a) (a).begin(), (a).end()
#define replr(i, a, b) for (int i = int(a); i <= int(b); ++i)
#define reprl(i, a, b) for (int i = int(a); i >= int(b); --i)
#define rep(i, n) for (int i = 0; i < int(n); ++i)
#define mkp(a, b) make_pair(a, b)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> PII;
typedef vector<int> VI;
typedef vector<PII> VPI;
typedef vector<VI> VVI;
typedef vector<VVI> VVVI;
typedef vector<VPI> VVPI;
typedef pair<ll, ll> PLL;
typedef vector<ll> VL;
typedef vector<PLL> VPL;
typedef vector<VL> VVL;
typedef vector<VVL> VVVL;
typedef vector<VPL> VVPL;
template<class T> T setmax(T& a, T b) {if (a < b) return a = b; return a;}
template<class T> T setmin(T& a, T b) {if (a < b) return a; return a = b;}
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
template<class T>
using indset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#include "doll.h"

namespace TEST5 {
    void solve(int M, VI A) {
        int N = A.size();
        VI C;
        VI X;
        VI Y;
        if (A.size() == 1) {
            C.pb(1);
            C.pb(0);
            answer(C, X, Y);
            return;
        }
        C.pb(1);
        C.pb(-1);
        int s = 0;
        while ((1<<s) < N) s++;
        replr(i, 2, s+1) {
            X.pb(-1);
            Y.pb(-i);
        }
        Y.back() = 0;
        int n = N-1;
        rep(i, s) {
            if (n & (1<<i)) {
                X[s-1-i] = 1;
            }
        }
        answer(C, X, Y);
    }
};
namespace TEST6 {
    typedef VI::iterator VIT;
    void solve(int M, VI A) { int N = A.size();
        VI C, X, Y;
        X.reserve(2*A.size());
        Y.reserve(2*A.size());
        C = VI(M+1);
        
        VI cnt(M+1);
        for (int x : A) cnt[x]++;
        VI lwb(N+1);
        replr(i, 0, N) {
            int x = 0;
            while ((1<<x) < i) x++;
            lwb[i] = x;
        }

        VI sw(M+1, -1);
        vector<vector<VIT>> order(M+1);
        auto trans = [&](int x) {
            return -(x+1);
        };
        auto flip = [&](int x, int s) {
            rep(i, s/2) {
                int ch = bool(x&(1<<i))^bool(x&(1<<(s-1-i)));
                x ^= (ch<<i);
                x ^= (ch<<(s-1-i));
            }
            return x;
        };
        auto print = [&](VIT it) {
            if (X.begin() <= it && it < X.end()) {
                cout << "X[" << it-X.begin() << "]";
            } else {
                cout << "Y[" << it-Y.begin() << "]";
            }
        };
        VI turn(M+1);
        int u = 0;
        for (int v : A) {
            if (cnt[u] > 1) {
                int sz = lwb[cnt[u]];
                if (sw[u] == -1) {
                    sw[u] = X.size();
                    C[u] = trans(sw[u]);
                    int l = (1<<(sz-1))-1;
                    int r = (1<<sz)-2;
                    replr(i, 0, r) {
                        X.pb(0), Y.pb(0);
                    }
                    replr(i, 0, l-1) {
                        /*cout << trans(sw[u]+2*i+1) << endl;*/
                        /*cout << trans(sw[u]+2*i+2) << endl;*/
                        X[sw[u]+i] = trans(sw[u] + 2*i+1);
                        Y[sw[u]+i] = trans(sw[u] + 2*i+2);
                    }
                    order[u] = vector<VIT>(1<<sz);
                    replr(i, l, r) {
                        order[u][flip(i*2+1-(r+1), sz)] = X.begin() + sw[u]+i;
                        order[u][flip(i*2+2-(r+1), sz)] = Y.begin() + sw[u]+i;
                    }
                    rep(i, (1<<sz)-cnt[u]) {
                        *(order[u][i]) = trans(sw[u]);
                    }
                    turn[u] = (1<<sz)-cnt[u];
                }
                *(order[u][turn[u]++]) = v;
            } else {
                C[u] = v;
            }
            u = v;
        }
        /*rep(u, C.size()) cout << u << ": " << C[u] << endl;*/
        /*rep(u, X.size()) cout << trans(u) << ": " << X[u] << ", " << Y[u] << endl;*/
        assert(X.size() <= 2*N);
        answer(C, X, Y);
    }
};

void create_circuit(int M, VI A) {
    if (M == 1) TEST5::solve(M, A);
    else TEST6::solve(M, A);
}

Compilation message

In file included from /usr/include/c++/10/ext/pb_ds/detail/pat_trie_/pat_trie_.hpp:45,
                 from /usr/include/c++/10/ext/pb_ds/detail/container_base_dispatch.hpp:90,
                 from /usr/include/c++/10/ext/pb_ds/assoc_container.hpp:48,
                 from doll.cpp:28:
doll.cpp: In function 'void TEST6::solve(int, VI)':
doll.cpp:138:25: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  138 |         assert(X.size() <= 2*N);
      |                ~~~~~~~~~^~~~~~
doll.cpp:94:14: warning: variable 'print' set but not used [-Wunused-but-set-variable]
   94 |         auto print = [&](VIT it) {
      |              ^~~~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 12 ms 6492 KB Output is correct
3 Correct 10 ms 4956 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 6 ms 4956 KB Output is correct
6 Correct 15 ms 7256 KB Output is correct
7 Correct 0 ms 600 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 12 ms 6492 KB Output is correct
3 Correct 10 ms 4956 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 6 ms 4956 KB Output is correct
6 Correct 15 ms 7256 KB Output is correct
7 Correct 0 ms 600 KB Output is correct
8 Correct 33 ms 10124 KB Output is correct
9 Correct 28 ms 10332 KB Output is correct
10 Correct 48 ms 15184 KB Output is correct
11 Correct 0 ms 344 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 12 ms 6492 KB Output is correct
3 Correct 10 ms 4956 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 6 ms 4956 KB Output is correct
6 Correct 15 ms 7256 KB Output is correct
7 Correct 0 ms 600 KB Output is correct
8 Correct 33 ms 10124 KB Output is correct
9 Correct 28 ms 10332 KB Output is correct
10 Correct 48 ms 15184 KB Output is correct
11 Correct 0 ms 344 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 52 ms 15952 KB Output is correct
15 Correct 28 ms 8796 KB Output is correct
16 Correct 40 ms 13144 KB Output is correct
17 Correct 0 ms 344 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
19 Correct 0 ms 348 KB Output is correct
20 Correct 53 ms 15136 KB Output is correct
21 Correct 0 ms 348 KB Output is correct
22 Correct 0 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 9 ms 2732 KB Output is correct
3 Correct 9 ms 2904 KB Output is correct
4 Correct 14 ms 4188 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 9 ms 2732 KB Output is correct
3 Correct 9 ms 2904 KB Output is correct
4 Correct 14 ms 4188 KB Output is correct
5 Partially correct 55 ms 16464 KB Output is partially correct
6 Partially correct 59 ms 16980 KB Output is partially correct
7 Partially correct 53 ms 16728 KB Output is partially correct
8 Partially correct 64 ms 17232 KB Output is partially correct
9 Partially correct 38 ms 11608 KB Output is partially correct
10 Partially correct 58 ms 17232 KB Output is partially correct
11 Partially correct 61 ms 17320 KB Output is partially correct
12 Partially correct 39 ms 11608 KB Output is partially correct
13 Partially correct 38 ms 11092 KB Output is partially correct
14 Partially correct 38 ms 11052 KB Output is partially correct
15 Partially correct 36 ms 10992 KB Output is partially correct
16 Partially correct 1 ms 604 KB Output is partially correct
17 Partially correct 34 ms 9604 KB Output is partially correct
18 Partially correct 33 ms 9564 KB Output is partially correct
19 Partially correct 35 ms 10024 KB Output is partially correct
20 Partially correct 54 ms 13652 KB Output is partially correct
21 Partially correct 54 ms 15696 KB Output is partially correct
22 Partially correct 46 ms 12932 KB Output is partially correct