답안 #975592

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
975592 2024-05-05T14:11:19 Z LucaIlie 자동 인형 (IOI18_doll) C++17
18 / 100
74 ms 14712 KB
#include "doll.h"
#include <bits/stdc++.h>

using namespace std;

const int MAX_M = 1e5;
const int MAX_L = (1 << 18);
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;

void dfs( int v, int s, int l, bool canCut ) {
    //printf( "%d\n", v );
    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[c] = v;
    }

    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]] )] );
        //printf( "%d %d %d\n", i, xaux[i], yaux[i] );
    }

    for ( auto leaf: leafs ) {
        //printf( "%d\n", leaf.first );
        int v = nrml[leaf.first];
        if ( leaf.second == 0 )
            xaux[v] = 1;
        else
            yaux[v] = 1;
    }
    yaux[yaux.size() - 1] = 0;

    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++ ) {
      |                      ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB wrong motion
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB wrong motion
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB wrong motion
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB wrong motion
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 44 ms 8712 KB Output is correct
3 Correct 52 ms 10712 KB Output is correct
4 Correct 71 ms 14124 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 44 ms 8712 KB Output is correct
3 Correct 52 ms 10712 KB Output is correct
4 Correct 71 ms 14124 KB Output is correct
5 Incorrect 74 ms 14712 KB wrong motion
6 Halted 0 ms 0 KB -