Submission #601531

#TimeUsernameProblemLanguageResultExecution timeMemory
601531HanksburgerMechanical Doll (IOI18_doll)C++17
85.55 / 100
98 ms15876 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> v[100005], w, ww, c, x, y;
void f(int u, int p, int i, int l, int r, int z)
{
    if (l+1==r)
    {
        if (l>=z)
            x[u-1]=v[i][l-z];
        else
            x[u-1]=-p;
        if (r>=z)
            y[u-1]=v[i][r-z];
        else
            y[u-1]=-p;
        return;
    }
    int m=(l+r)/2;
    if (m>=z)
    {
        x.push_back(0);
        y.push_back(0);
        int U=x.size();
        x[u-1]=-U;
        f(U, p, i, l, m, z);
    }
    else
        x[u-1]=-p;
    if (r>=z)
    {
        x.push_back(0);
        y.push_back(0);
        int U=x.size();
        y[u-1]=-U;
        f(U, p, i, m+1, r, z);
    }
    else
        y[u-1]=-p;
}
void create_circuit(int m, vector<int> a)
{
    a.push_back(0);
    for (int i=1; i<a.size(); i++)
        v[a[i-1]].push_back(a[i]);
    c.push_back(a[0]);
    for (int i=1; i<=m; i++)
    {
        int sz=v[i].size();
        if (!sz)
            c.push_back(0);
        else if (sz==1)
            c.push_back(v[i][0]);
        else
        {
            int loog=log2(sz-0.5)+1;
            int num=1<<loog;
            w.clear();
            ww.clear();
            for (int j=0; j<num; j++)
            {
                int sum=0;
                for (int k=0; k<loog; k++)
                    if (j&(1<<k))
                        sum+=1<<(loog-k-1);
                if (sum>=num-sz)
                    w.push_back(sum-num+sz);
            }
            for (int j=0; j<sz; j++)
                ww.push_back(0);
            for (int j=0; j<sz; j++)
                ww[w[j]]=v[i][j];
            v[i]=ww;
            x.push_back(0);
            y.push_back(0);
            int u=x.size();
            c.push_back(-u);
            f(u, u, i, 0, num-1, num-sz);
        }
    }
    answer(c, x, y);
}

Compilation message (stderr)

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:44:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |     for (int i=1; i<a.size(); i++)
      |                   ~^~~~~~~~~
#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...