Submission #1281012

#TimeUsernameProblemLanguageResultExecution timeMemory
1281012FaggiBit Shift Registers (IOI21_registers)C++20
23 / 100
1 ms756 KiB
#include <bits/stdc++.h>
#define ll int
#define sz(x) int(x.size())
#define forn(i, n) for (i = 0; i < n; i++)
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define fr first
#define se second
using namespace std;

void append_move(int t, int x);
void append_store(int t, std::vector<bool> v);
void append_and(int t, int x, int y);
void append_or(int t, int x, int y);
void append_xor(int t, int x, int y);
void append_not(int t, int x);
void append_left(int t, int x, int s);
void append_right(int t, int x, int s);
void append_add(int t, int x, int y);
void append_print(int t);
void construct_instructions(int s, int n, int k, int q);

void construct_instructions(int s, int n, int k, int q)
{
    ll i, b=2000, j;
    vector<bool>v(b,0);
    for(i=0; i<k; i++)
        v[i]=1;
    append_store(99,v); 

    for(i=1; i<n; i++)
    {
        for(j=0; j<n-i; j++)
        {
            append_left(1,0,b-k*(j+1)); //solo n1
            append_right(1,1,b-k); // pegar a la izquierda
            
            append_left(2,0,b-k*(j+2)); // solo n2 y n1
            append_right(2,2,b-k); // pegar a la izquierda y borrar n1
            
            append_not(2,2); // -n2
            append_add(2,1,2); // -n2+n1
            
            append_right(2,2,b-1); // obtener signo
            
            append_add(2,2,99); // te quedan k unos si n1>n2 o k ceros si n1<n2
            append_left(2,2,b-k); // solo resultado
            append_right(2,2,b-k); // pegar a la izquierda
            append_not(9,2);
            
            append_left(3,0,b-k*(j+2)); // solo n2 y n1
            append_right(3,3,b-k); // pegar a la izquierda y borrar n1
        
            append_and(5,1,9); // habilitarlo si n1 es el menor
            append_and(4,3,2); // habilitarlo si n2 es el menor
            append_or(6,5,4); // dejar en la pos 1 al menor
        
            append_and(5,1,2); // habilitar n1 si es el mas grande
            append_and(4,3,9); // habilitar n2 si es el mas grande
            append_or(7,5,4); // dejar en la pos 1 el mas grande
        
            append_left(7,7,k); // moverlo a la pos 2
            append_or(8,7,6); // unirlos
        
            append_right(10,0,k*(j+2)); // sacar n1 y n2 de 0
            append_left(10,10,k*(j+2)); // acomodar 0

            append_left(11,0,b-k*j); // sacar n1 y n2 de 0
            append_right(11,11,b-k*j); // acomodar 0

            append_or(0,11,10); // unir todo sin n1 ni n2
            append_left(8,8,k*j); // acomodar n1 y n2
            append_or(0,0,8); // volver a insertar n1 y n2 en orden

        }
    }

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