Submission #75469

#TimeUsernameProblemLanguageResultExecution timeMemory
75469dimatcMechanical Doll (IOI18_doll)C++14
9 / 100
328 ms38008 KiB
#include "doll.h"
#include<bits/stdc++.h>
using namespace std;

/*struct nod {
    int nr;
    int x, y;
    bool u;
};

nod h[600010];
node *H;

void build(int n, vector<int> A) {
    A.push_back(0);//!!!
    int k=0, leaves = (1<<(ceil(log2(n))))-1;
    while (k<=leaves) {
        if (k > leaves/2) {
            h[++k] = {k, 1, 1, false};
        } else {
            h[++k]={k, 2*k, 2*k+1, false}
        }
    }

    k=0;
    while (k<=n) {
        int p=1

        if (!h[p].u) {
            p=2*n;
            if (p>leaves) {
                h[p/2].x = A[k];
            }
        } else {
            p=2*n+1;
            if (p>leaves) {
                h[p/2].y = A[k];
            }
        }
    }

    int k = 1, leaves = (1<<(ceil(log2(n)))-1);
    H = new node(k, 0, 0);
    node p = H;
    while (k <= leaves) {
        if (k >= leaves/2) {
            p.x = p.y = H;
        } else {
            p.x = new no
        }
    }
}

void build(int nr, int h, node *p) {
    if (h== htree) {
        p.x = p.y = H;
        return;
    }
    p.x = new node(nr*2, 0,0,0,0);
    build(2*nr, h+1, p.x);
    p.y = new node(nr*2+1, 0,0,0,0);
    build(2*nr+1, h+1, p.x);
}*/

int height;

struct node {
    int nr;
    bool u;
    node *x;
    node *y;
};
node *H;

std::vector<int> X(400005), Y(400005);
void build(int nr, int h, node* p) {
    //cout<<"!"<<p->nr<<'\n';

    if (h == height) {
        p->x = p->y = H;
            //cout<<"!"<<p->nr<<"\n";
        return;
    }
    X[p->nr -1] = -2*nr;
    Y[p->nr -1] = -(2*nr+1);
    p->x = new node({2*nr, 0, 0, 0});
    build(2*nr, h+1, p->x);
    p->y = new node({2*nr + 1, 0, 0, 0});
    build(2*nr + 1, h+1, p->y);
}

void create_circuit(int M, std::vector<int> A) {
  A.push_back(0);

  std::vector<int> C(M + 1);

  height = ceil(log2(A.size()));
  //cout<<height<<'\n';
  int leaves = (1<< (int)(ceil(log2(A.size())))) - 1;
  //cout<<"Leaves = "<<leaves<<'\n';

  H = new node({1,0,0,0});
  build(1, 1, H);
  int k=0; //insert 0 in a
  while (k<A.size()) { //check
     //   cout<<"k="<<k<<'\n';
    node* p=H;
    while (p->y != H) { //switch u before if
        p->u = !(p->u);
        if ((p->u)) {
            p=p->x;
        } else {
            p=p->y;
        }
       // cout<<p->nr<<'.';
    }
    if (!(p->u)) {
        p->x = new node({A[k], 0,0,0});
        X[p->nr -1]=A[k];
        ++k;
    } else {
        p->y = new node({A[k],0,0,0});
        Y[p->nr -1]=A[k];
        ++k;
    }
    p->u = !(p->u);
  }
  //cout<<"!!!!!!K"<<k<<'\n';
  for (int i=0; i<=M+1; i++) C[i]=-1;
  X.resize(leaves); // x-1
  Y.resize(leaves);

  for (int i=0; i<X.size(); i++) {
    if (X[i]==0) X[i]=-1;
    if (Y[i]==0 && i!=X.size()-1) Y[i]=-1;
    //cout<<X[i]<<" "<<Y[i]<<'\n';
  }

  answer(C, X, Y);
}

Compilation message (stderr)

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:105:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |   while (k<A.size()) { //check
      |          ~^~~~~~~~~
doll.cpp:133:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  133 |   for (int i=0; i<X.size(); i++) {
      |                 ~^~~~~~~~~
doll.cpp:135:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  135 |     if (Y[i]==0 && i!=X.size()-1) Y[i]=-1;
      |                    ~^~~~~~~~~~~~
#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...