Submission #141522

#TimeUsernameProblemLanguageResultExecution timeMemory
141522CaroLindaMechanical Doll (IOI18_doll)C++14
100 / 100
210 ms24168 KiB
#include "doll.h"
#include <bits/stdc++.h>

#define printPii(p) printf("%d %d\n" ,p.ff , p.ss)
#define debug printf
#define lp(i,a,b) for(int i=a;i<b;i++)
#define pii pair<int,int>
#define ll long long
#define ff first
#define ss second
#define pb push_back
#define mk make_pair

const int inf=1e9+10 ;
const int MAXN = 2e5+10;

using namespace std ;

int n , m , qtd ;
int triggers[MAXN*2] ;
vector<pii> folha ;

// -------------------------

struct node
{

  int id , l , r , gate ;
  bool exist ;

} ;

node v[MAXN*4] ;

int mid(int l , int r ) { return (l+r)/2 ; }


void createTree(int pos, int l , int r )
{

  v[pos].id = -pos ;

  if(l==r) return ;


  createTree( pos*2, l , mid(l,r) ) ;
  createTree(pos*2+1, mid(l,r)+1 , r ) ;

  v[pos].gate = 0 ;
  v[pos].exist = false ;

}

void simulate( int pos , int l , int r , int cnt )
{

  if( l == r )
  {

    folha.pb(mk( pos , cnt )) ;

    if( ++cnt <= qtd )  simulate(1 , 1 , qtd , cnt) ;

    return ;

  }

  int idx = pos*2 ;
  pii p = mk( l , mid(l,r) ) ;

  if( v[pos].gate == 1 )
  {
    idx ++ ;
    p = mk( mid(l,r)+1 , r ) ;
  }

  v[pos].gate = !v[pos].gate ;

  simulate( idx , p.ff , p.ss , cnt ) ;

}

pii helpful[MAXN*4] ;

void finalize(int pos, int l, int r )
{

  if( l ==  r) return ;

  finalize( pos*2 , l , mid(l,r) ) ;
  finalize(pos*2+1, mid(l,r)+1, r) ;

  if( !v[pos*2].exist && !v[pos*2+1].exist )
  {
    v[pos].exist = false ;
    return ;
  }

  v[pos].exist = true ;
}

int cnt = 1 ;

void lastProcessing( int pos , int l , int r )
{

  if(l==r) return ;

  if( v[pos].exist ) v[pos].id = - cnt ;
  else { v[pos].id = -1 ; return ; }

  cnt ++ ;

  lastProcessing( pos*2 , l , mid(l,r) ) ;
  lastProcessing(pos*2+1, mid(l,r)+1 , r ) ; 

  v[pos].l = ( v[pos*2].exist ? v[pos*2].id : -1 ) ;
  v[pos].r = ( v[pos*2+1].exist ? v[pos*2+1].id : -1 ) ;

  int idx = -v[pos].id ;

  helpful[idx] = mk( v[pos].l , v[pos].r ) ;

}

void print(int pos,  int l , int r )
{
  printf("%d (%d %d) -> %d %d %d\n" , pos , l , r , v[pos].id , v[pos].l , v[pos].r ) ;
  printf("%d!\n" , v[pos].exist ) ;
  if(l==r) return ;
  print(pos*2 , l,  mid(l,r)) ;
  print(pos*2+1, mid(l,r)+1, r) ;
}

void create_circuit(int M, vector<int> A) 
{
  m = M ;
  n = A.size() ;
  lp(i,1,n+1) triggers[i] = A[i-1] ;
  triggers[++n] = 0 ;

  vector<int> c(m+1) ;
  lp(i,0,m+1) c[i] = -1 ;



  for(int i = 0 ; i <= 21 ; i++ )
    if( (1<<i) >= n )
      { qtd = (1<<i) ; break ; }


  createTree( 1 , 1 , qtd );
  simulate(1,1,qtd , 1) ;

  sort( folha.begin() , folha.end() ) ;    //ordena por id na arvore
  reverse(folha.begin() , folha.end() ) ;
  lp(i,0,n) swap( folha[i].ff  ,folha[i].ss ) ;
  sort( folha.begin() , folha.begin() + n ) ; //ordena os n ultimos por oderm de processamento
  lp(i,0,n) 
  {
    int idx = folha[i].ss ;

    v[ idx ].id = triggers[i+1] ;
    v[idx].exist = true ;
  }

  finalize(1,1,qtd) ;
  lastProcessing(1,1,qtd) ;
 // print(1,1,qtd);

  vector<int> x(cnt-1) , y(cnt-1) ;

  lp(i,0,cnt-1) 
  {
    x[i] = helpful[i+1].ff ;
    y[i] = helpful[i+1].ss ;
  }

  answer(c,x,y) ;

}
#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...