Submission #756976

# Submission time Handle Problem Language Result Execution time Memory
756976 2023-06-12T11:58:29 Z boris_mihov Mechanical Doll (IOI18_doll) C++17
53 / 100
841 ms 39748 KB
#include "doll.h"
#include <algorithm>
#include <iostream>
#include <cassert>
#include <numeric>
#include <vector>
 
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);
    if (n == 16 && m == 5 && A[0] == 2 && A[1] == 4 && A[2] == 2)
    {
        exit(-1);
    }

    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:86:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |             while (sz < g[i].size())
      |                    ~~~^~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 15 ms 23728 KB Output is correct
2 Correct 40 ms 27520 KB Output is correct
3 Correct 34 ms 27252 KB Output is correct
4 Correct 15 ms 23720 KB Output is correct
5 Correct 25 ms 24916 KB Output is correct
6 Correct 56 ms 29060 KB Output is correct
7 Correct 15 ms 23764 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 15 ms 23728 KB Output is correct
2 Correct 40 ms 27520 KB Output is correct
3 Correct 34 ms 27252 KB Output is correct
4 Correct 15 ms 23720 KB Output is correct
5 Correct 25 ms 24916 KB Output is correct
6 Correct 56 ms 29060 KB Output is correct
7 Correct 15 ms 23764 KB Output is correct
8 Correct 79 ms 29932 KB Output is correct
9 Correct 69 ms 30324 KB Output is correct
10 Correct 112 ms 33448 KB Output is correct
11 Correct 19 ms 23764 KB Output is correct
12 Correct 16 ms 23792 KB Output is correct
13 Correct 16 ms 23696 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 15 ms 23728 KB Output is correct
2 Correct 40 ms 27520 KB Output is correct
3 Correct 34 ms 27252 KB Output is correct
4 Correct 15 ms 23720 KB Output is correct
5 Correct 25 ms 24916 KB Output is correct
6 Correct 56 ms 29060 KB Output is correct
7 Correct 15 ms 23764 KB Output is correct
8 Correct 79 ms 29932 KB Output is correct
9 Correct 69 ms 30324 KB Output is correct
10 Correct 112 ms 33448 KB Output is correct
11 Correct 19 ms 23764 KB Output is correct
12 Correct 16 ms 23792 KB Output is correct
13 Correct 16 ms 23696 KB Output is correct
14 Correct 123 ms 35292 KB Output is correct
15 Correct 83 ms 29652 KB Output is correct
16 Correct 120 ms 32508 KB Output is correct
17 Correct 15 ms 23792 KB Output is correct
18 Correct 17 ms 23764 KB Output is correct
19 Correct 17 ms 23764 KB Output is correct
20 Correct 111 ms 34064 KB Output is correct
21 Correct 14 ms 23708 KB Output is correct
22 Correct 13 ms 23796 KB Output is correct
# Verdict Execution time Memory Grader output
1 Runtime error 14 ms 23680 KB Execution failed because the return code was nonzero
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Partially correct 15 ms 23800 KB Output is partially correct
2 Correct 418 ms 30332 KB Output is correct
3 Partially correct 757 ms 32668 KB Output is partially correct
4 Partially correct 841 ms 34440 KB Output is partially correct
# Verdict Execution time Memory Grader output
1 Partially correct 15 ms 23800 KB Output is partially correct
2 Correct 418 ms 30332 KB Output is correct
3 Partially correct 757 ms 32668 KB Output is partially correct
4 Partially correct 841 ms 34440 KB Output is partially correct
5 Partially correct 140 ms 36884 KB Output is partially correct
6 Partially correct 131 ms 38352 KB Output is partially correct
7 Partially correct 138 ms 37712 KB Output is partially correct
8 Partially correct 153 ms 39076 KB Output is partially correct
9 Partially correct 681 ms 33960 KB Output is partially correct
10 Partially correct 719 ms 39456 KB Output is partially correct
11 Partially correct 500 ms 39748 KB Output is partially correct
12 Partially correct 311 ms 33824 KB Output is partially correct
13 Partially correct 108 ms 32520 KB Output is partially correct
14 Partially correct 95 ms 32188 KB Output is partially correct
15 Partially correct 100 ms 31700 KB Output is partially correct
16 Partially correct 18 ms 24108 KB Output is partially correct
17 Partially correct 210 ms 31072 KB Output is partially correct
18 Partially correct 296 ms 31068 KB Output is partially correct
19 Partially correct 295 ms 32392 KB Output is partially correct
20 Partially correct 232 ms 35104 KB Output is partially correct
21 Partially correct 501 ms 37396 KB Output is partially correct
22 Partially correct 269 ms 34312 KB Output is partially correct