제출 #431589

#제출 시각아이디문제언어결과실행 시간메모리
431589Enkognit자동 인형 (IOI18_doll)C++14
43 / 100
243 ms25524 KiB
#include <bits/stdc++.h>
#include "doll.h"
#define ll long long
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define pll pair<ll,ll>
#define all(v) v.begin(),v.end()

using namespace std;

ll n, m, s, nxt[100005], k=0;
pll a[400005];
vector<ll> v[100005];
bool tt[400005];

ll build(int l,int r)
{
    if (l==r)
    {
        return 0;
    }
    s--;
    ll nw=s;
    int w=(l+r)/2;
    a[-nw].fi=build(l,w);
    a[-nw].se=build(w+1,r);
    return nw;
}

ll dfs(int nw,int l,int r,int k)
{
    if (l==r)
    {
        return k;
    }
    int w=(l+r)/2;
    if (!tt[nw])
    {
        ll o=dfs(a[-nw].fi, l, w, k);
        if (o!=-1e18) a[-nw].fi=o;
    }else
    {
        ll o=dfs(a[-nw].se, w+1, r, k);
        if (o!=-1e18) a[-nw].se=o;
    }
    tt[nw]^=1;
    return -1e18;
}

bool zz[1000005];

void create_circuit(int m, vector<int> aa) {
    s=0;
    for (int i = 1; i <= 1e6; i*=2) zz[i]=1;
    aa.pb(0);
    for (int i = 0; i < aa.size()-1; i++)
    {
        v[aa[i]].pb(aa[i+1]);
    }
    nxt[0]=aa[0];
    for (int i = 1; i <= m; i++)
        if (v[i].size()>0)
        {
            if (v[i].size()==1)
                nxt[i]=v[i][0]; else
            {
                ll tt=0;
                reverse(all(v[i]));
                if (!zz[v[i].size()])
                {
                    s--;
                    a[-s].fi=s;
                    a[-s].se=0;
                    tt=s;
                }

                while (!zz[v[i].size()])
                {
                    v[i].pb(s);
                }
                reverse(all(v[i]));

                ll o=build(0,v[i].size()-1);
                nxt[i]=o;
                if (tt!=0) a[-tt].se=o;

                for (int j = 0; j < v[i].size(); j++)
                    dfs(o, 0, v[i].size()-1, v[i][j]);
            }
        }
    std::vector<int> X, Y, C;
    X.resize(-s);
    Y.resize(-s);
    C.resize(m+1);
    for (int i = 0; i <= m; i++)
        C[i]=(int)nxt[i];
    for (int i = -1; i >= s; i--)
        X[-i-1]=(int)a[-i].fi, Y[-i-1]=(int)a[-i].se;

    /*cout << m << " " << aa.size() << "\n";
    for (int i = 0; i < aa.size(); i++)cout << aa[i] << " ";
    cout << "\n";

    for (int i = 0; i < C.size(); i++)
        cout << C[i] << " ";
    cout << "\n";
    for (int i = 0; i < X.size(); i++)
        cout << X[i] << " ";
    cout << "\n";
    for (int i = 0; i < Y.size(); i++)
        cout << Y[i] << " ";
    cout << "\n";*/
    answer(C, X, Y);
}

컴파일 시 표준 에러 (stderr) 메시지

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