Submission #975607

# Submission time Handle Problem Language Result Execution time Memory
975607 2024-05-05T14:27:41 Z LucaIlie Mechanical Doll (IOI18_doll) C++17
84 / 100
159 ms 262144 KB
#include "doll.h"
#include <bits/stdc++.h>

using namespace std;

const int MAX_M = 2e5;
const int MAX_L = (1 << 20);
int ord[MAX_L];

vector<int> c, x, y;
int switchid( int x ) {
    return -(x + 1);
}
int idswitch( int x ) {
    return -(x + 1);
}


vector<int> vert;
vector<pair<int, int>> leafs;
int P;

void dfs( int v, int s, int l, bool canCut ) {
    vert.push_back( v );
    if ( canCut && ((s >> l) & 1) ) {
        x[v] = -1;
        if ( l == 0 ) {
            leafs.push_back( { v, 1 } );
            return;
        }
        dfs( v * 2 + 2, s, l - 1, canCut );
        return;
    }
    if ( l == 0 ) {
        leafs.push_back( { v, 0 } );
        leafs.push_back( { v, 1 } );
        return;
    }
    dfs( v * 2 + 1, s, l - 1, canCut );
    dfs( v * 2 + 2, s, l - 1, false );
}

void create_circuit( int m, vector<int> a ) {
    int n = a.size();

    c.resize( m + 1 );
    a.push_back( 0 );
    c[0] = a[0];

    int p = ceil( log2( n ) );
    x.resize( (1 << p) - 1 );
    y.resize( (1 << p) - 1 );
    for ( int v = 0; v < (1 << (p - 1)) - 1; v++ ) {
        x[v] = switchid( v * 2 + 1 );
        y[v] = switchid( v * 2 + 2 );
    }
    for ( int v = 0; v < (1 << p); v++ ) {
        int c = 0;
        for ( int b = 0; b < p; b++ ) {
            if ((v >> b) & 1 )
                c += (1 << (p - 1 - b));
        }
        ord[v] = c;
    }

    dfs( 0, (1 << p) - n, p - 1, true );

    for ( int i = 1; i <= m; i++ )
        c[i] = -1;

    vector<int> nrml( x.size() );
    for ( int v = 0; v < x.size(); v++ )
        nrml[v] = -1;
    sort( vert.begin(), vert.end() );
    for ( int i = 0; i < vert.size(); i++ )
        nrml[vert[i]] = i;
    vector<int> xaux( vert.size() ), yaux( vert.size() );
    for ( int i = 0; i < vert.size(); i++ ) {
        xaux[i] = switchid( nrml[idswitch( x[vert[i]] )] );
        yaux[i] = switchid( nrml[idswitch( y[vert[i]] )] );
    }

    P = p;
    sort( leafs.begin(), leafs.end(), []( auto c, auto d ) {
        return ord[(c.first - (1 << (P - 1)) + 1) * 2 + c.second] < ord[(d.first - (1 << (P - 1)) + 1) * 2 + d.second];
    } );

    int ind = 1;
    for ( auto leaf: leafs ) {
        int v = nrml[leaf.first];
        if ( leaf.second == 0 )
            xaux[v] = a[ind];
        else
            yaux[v] = a[ind];
        ind++;
    }

    answer( c, xaux, yaux );
}

Compilation message

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:72:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |     for ( int v = 0; v < x.size(); v++ )
      |                      ~~^~~~~~~~~~
doll.cpp:75:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |     for ( int i = 0; i < vert.size(); i++ )
      |                      ~~^~~~~~~~~~~~~
doll.cpp:78:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |     for ( int i = 0; i < vert.size(); i++ ) {
      |                      ~~^~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 35 ms 7900 KB Output is correct
3 Correct 37 ms 8772 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 7 ms 1492 KB Output is correct
6 Correct 60 ms 10804 KB Output is correct
7 Runtime error 159 ms 262144 KB Execution killed with signal 9
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 35 ms 7900 KB Output is correct
3 Correct 37 ms 8772 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 7 ms 1492 KB Output is correct
6 Correct 60 ms 10804 KB Output is correct
7 Runtime error 159 ms 262144 KB Execution killed with signal 9
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 35 ms 7900 KB Output is correct
3 Correct 37 ms 8772 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 7 ms 1492 KB Output is correct
6 Correct 60 ms 10804 KB Output is correct
7 Runtime error 159 ms 262144 KB Execution killed with signal 9
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 600 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 56 ms 10420 KB Output is correct
3 Correct 66 ms 11892 KB Output is correct
4 Correct 97 ms 15372 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 56 ms 10420 KB Output is correct
3 Correct 66 ms 11892 KB Output is correct
4 Correct 97 ms 15372 KB Output is correct
5 Correct 98 ms 16888 KB Output is correct
6 Correct 101 ms 16280 KB Output is correct
7 Correct 98 ms 16444 KB Output is correct
8 Correct 112 ms 16168 KB Output is correct
9 Correct 75 ms 12164 KB Output is correct
10 Correct 94 ms 16292 KB Output is correct
11 Correct 96 ms 15660 KB Output is correct
12 Correct 64 ms 12148 KB Output is correct
13 Correct 62 ms 11176 KB Output is correct
14 Correct 67 ms 12660 KB Output is correct
15 Correct 78 ms 12916 KB Output is correct
16 Correct 3 ms 600 KB Output is correct
17 Correct 57 ms 10612 KB Output is correct
18 Correct 56 ms 10568 KB Output is correct
19 Correct 64 ms 12156 KB Output is correct
20 Correct 97 ms 15836 KB Output is correct
21 Correct 98 ms 15568 KB Output is correct
22 Correct 94 ms 15832 KB Output is correct