Submission #96146

#TimeUsernameProblemLanguageResultExecution timeMemory
96146bogdan10bosMechanical Doll (IOI18_doll)C++14
85.55 / 100
178 ms11196 KiB
#include <bits/stdc++.h>
#include "doll.h"

using namespace std;

int S;
vector<int> X, Y;
vector<int> newv, pos, where;

int make_switch(int st, int dr, int idd = -1)
{
    bool ok = true;
    for(int i = st + 1; i <= dr; i++)
        if(newv[i] != newv[st])
        {
            ok = false;
            break;
        }
    if(ok)  return newv[st];
    if(st + 1 == dr)
    {
        if(idd == -1)
        {
            S++;
            X.push_back(newv[st]);
            Y.push_back(newv[dr]);
            return -S;
        }
        else
        {
            X[idd - 1] = newv[st];
            Y[idd - 1] = newv[dr];
            return -idd;
        }
    }

    int id = -1;
    if(idd == -1)
    {
        S++;
        id = S;
        X.push_back(0);
        Y.push_back(0);
    }
    else
        id = idd;

    int mij = st + (dr - st) / 2;
    int sl = make_switch(st, mij);
    int sr = make_switch(mij + 1, dr);

    X[id - 1] = sl;
    Y[id - 1] = sr;
    return -id;
}

int make_switch(vector<int> v)
{
    if(v.empty())   return 0;
    if(v.size() == 1)
        return v[0];

    S++;
    X.push_back(0);
    Y.push_back(0);

    int l = v.size();
    int old = l;
    while( (l & (l - 1)) != 0 )
        l++;
    int mns = l - old;

    newv.clear();
    newv.resize(l);
    pos.clear();
    pos.resize(l);
    where.clear();
    where.resize(l);
    int lg = 0;
    for(lg = 0; (1 << lg) < l; lg++);
    for(int i = 0; i < l; i++)
    {
        int msk = i;
        int rmsk = 0;
        for(int j = 0; j < lg; j++)
            if((msk >> j) & 1)
                rmsk |= (1 << (lg - j - 1));
        pos[rmsk] = i;
        where[i] = rmsk;
    }
    vector<int> poss;
    for(int i = mns; i < l; i++)
        poss.push_back(pos[i]);
    sort(begin(poss), end(poss));
    for(int i = 0; i < old; i++)
        newv[ where[ poss[i] ] ] = v[i];
    for(int i = 0; i < mns; i++)
        newv[i] = -S;

    return make_switch(0, l - 1, S);
}

void create_circuit(int M, vector<int> A)
{
    vector< vector<int> > v;
    v.resize(M + 2);
    int lst = 0;
    for(int i = 0; i < A.size(); i++)
    {
        v[lst].push_back(A[i]);
        lst = A[i];
    }
    v[lst].push_back(0);

    vector<int> ex;
    ex.resize(M + 1);
    X.clear(), Y.clear();

    S = 0;
    for(int i = 0; i <= M; i++)
    {
        int l = v[i].size();
        ex[i] = make_switch(v[i]);
    }

    answer(ex, X, Y);
}

Compilation message (stderr)

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:108:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  108 |     for(int i = 0; i < A.size(); i++)
      |                    ~~^~~~~~~~~~
doll.cpp:122:13: warning: unused variable 'l' [-Wunused-variable]
  122 |         int l = v[i].size();
      |             ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...