Submission #756205

# Submission time Handle Problem Language Result Execution time Memory
756205 2023-06-11T10:00:19 Z boris_mihov Mechanical Doll (IOI18_doll) C++17
53 / 100
694 ms 39792 KB
#include <algorithm>
#include <iostream>
#include <cassert>
#include <numeric>
#include <vector>
#include "doll.h"

typedef long long llong;
const int MAXN = 1000000 + 10;
const int MAXS = 1000000 + 10;
const int INF  = 1e9;

int n, m, cnt;
std::vector <int> x, y, c;
std::vector <int> g[MAXN];
int perm[MAXN];
int treeRoot;

void rec(int l, int r, int node, int root)
{
    assert(l != r);
    if (l + 1 == r)
    {
        if (perm[l] < g[node].size()) y[root - 1] = g[node][perm[l]];
        else y[root - 1] = -treeRoot;

        if (perm[r] < g[node].size()) x[root - 1] = g[node][perm[r]];
        else x[root - 1] = -treeRoot;
        return;
    }

    int mid = (l + r) / 2;
    x.push_back(0);
    x.push_back(0);
    y.push_back(0);
    y.push_back(0);
    cnt += 2;

    y[root - 1] = -(cnt - 1);
    x[root - 1] = -cnt;
    rec(l, mid, node, -y[root - 1]);
    rec(mid + 1, r, node, -x[root - 1]);
}

int reversed(int x, int bits)
{
    int res = 0;
    for (int i = 0 ; i < bits ; ++i)
    {
        if (x & (1 << i))
        {
            res |= (1 << bits - 1 - i);
        }
    }

    return res;
}

void create_circuit(int M, std::vector <int> A)
{
    m = M; n = A.size(); A.push_back(0);
    for (int i = 1 ; i <= n ; ++i)
    {   
        g[A[i - 1]].push_back(A[i]);
    }

    c.resize(m + 1); c[0] = A[0];
    for (int i = 1 ; i <= m ; ++i)
    {
        if (g[i].empty())
        {
            continue;
        }

        if (g[i].size() == 1)
        {
            c[i] = g[i][0];
        } else
        {
            int sz = 1, bits = 0;
            while (sz < g[i].size())
            {
                sz <<= 1;
                bits++;
            }

            c[i] = -(++cnt);
            x.push_back(0);
            y.push_back(0);
            std::reverse(g[i].begin(), g[i].end());
            std::iota(perm, perm + sz, 0);
            std::sort(perm, perm + sz, [&](int x, int y)
            {
                return reversed(x, bits) < reversed(y, bits);
            });

            treeRoot = cnt;
            rec(0, sz - 1, i, cnt);
        }
    }

    assert(cnt <= 2 * n);
    answer(c, x, y);
}

Compilation message

doll.cpp: In function 'void rec(int, int, int, int)':
doll.cpp:24:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 |         if (perm[l] < g[node].size()) y[root - 1] = g[node][perm[l]];
      |             ~~~~~~~~^~~~~~~~~~~~~~~~
doll.cpp:27:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   27 |         if (perm[r] < g[node].size()) x[root - 1] = g[node][perm[r]];
      |             ~~~~~~~~^~~~~~~~~~~~~~~~
doll.cpp: In function 'int reversed(int, int)':
doll.cpp:52:35: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   52 |             res |= (1 << bits - 1 - i);
      |                          ~~~~~~~~~^~~
doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:81:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   81 |             while (sz < g[i].size())
      |                    ~~~^~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 14 ms 23764 KB Output is correct
2 Correct 40 ms 27472 KB Output is correct
3 Correct 37 ms 27180 KB Output is correct
4 Correct 13 ms 23792 KB Output is correct
5 Correct 21 ms 24916 KB Output is correct
6 Correct 45 ms 29072 KB Output is correct
7 Correct 16 ms 23764 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 14 ms 23764 KB Output is correct
2 Correct 40 ms 27472 KB Output is correct
3 Correct 37 ms 27180 KB Output is correct
4 Correct 13 ms 23792 KB Output is correct
5 Correct 21 ms 24916 KB Output is correct
6 Correct 45 ms 29072 KB Output is correct
7 Correct 16 ms 23764 KB Output is correct
8 Correct 57 ms 29952 KB Output is correct
9 Correct 64 ms 30296 KB Output is correct
10 Correct 80 ms 33580 KB Output is correct
11 Correct 13 ms 23764 KB Output is correct
12 Correct 14 ms 23764 KB Output is correct
13 Correct 13 ms 23788 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 14 ms 23764 KB Output is correct
2 Correct 40 ms 27472 KB Output is correct
3 Correct 37 ms 27180 KB Output is correct
4 Correct 13 ms 23792 KB Output is correct
5 Correct 21 ms 24916 KB Output is correct
6 Correct 45 ms 29072 KB Output is correct
7 Correct 16 ms 23764 KB Output is correct
8 Correct 57 ms 29952 KB Output is correct
9 Correct 64 ms 30296 KB Output is correct
10 Correct 80 ms 33580 KB Output is correct
11 Correct 13 ms 23764 KB Output is correct
12 Correct 14 ms 23764 KB Output is correct
13 Correct 13 ms 23788 KB Output is correct
14 Correct 95 ms 35308 KB Output is correct
15 Correct 55 ms 29636 KB Output is correct
16 Correct 80 ms 32472 KB Output is correct
17 Correct 14 ms 23764 KB Output is correct
18 Correct 14 ms 23764 KB Output is correct
19 Correct 13 ms 23764 KB Output is correct
20 Correct 101 ms 33888 KB Output is correct
21 Correct 13 ms 23792 KB Output is correct
22 Correct 13 ms 23800 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 13 ms 23768 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Partially correct 13 ms 23692 KB Output is partially correct
2 Correct 315 ms 30324 KB Output is correct
3 Partially correct 694 ms 32652 KB Output is partially correct
4 Partially correct 691 ms 34404 KB Output is partially correct
# Verdict Execution time Memory Grader output
1 Partially correct 13 ms 23692 KB Output is partially correct
2 Correct 315 ms 30324 KB Output is correct
3 Partially correct 694 ms 32652 KB Output is partially correct
4 Partially correct 691 ms 34404 KB Output is partially correct
5 Partially correct 132 ms 36916 KB Output is partially correct
6 Partially correct 136 ms 38232 KB Output is partially correct
7 Partially correct 124 ms 37836 KB Output is partially correct
8 Partially correct 145 ms 38860 KB Output is partially correct
9 Partially correct 643 ms 33852 KB Output is partially correct
10 Partially correct 675 ms 39344 KB Output is partially correct
11 Partially correct 437 ms 39792 KB Output is partially correct
12 Partially correct 291 ms 33764 KB Output is partially correct
13 Partially correct 97 ms 32380 KB Output is partially correct
14 Partially correct 85 ms 32032 KB Output is partially correct
15 Partially correct 85 ms 31592 KB Output is partially correct
16 Partially correct 16 ms 24068 KB Output is partially correct
17 Partially correct 202 ms 30956 KB Output is partially correct
18 Partially correct 243 ms 31044 KB Output is partially correct
19 Partially correct 225 ms 32328 KB Output is partially correct
20 Partially correct 195 ms 34944 KB Output is partially correct
21 Partially correct 421 ms 37244 KB Output is partially correct
22 Partially correct 237 ms 34180 KB Output is partially correct