Submission #817143

#TimeUsernameProblemLanguageResultExecution timeMemory
817143penguinmanBit Shift Registers (IOI21_registers)C++17
58 / 100
1 ms468 KiB
#include "registers.h" #include <bits/stdc++.h> using std::cin; using std::cout; using std::vector; using std::string; using std::endl; using ll = long long; using vi = vector<ll>; using vii = vector<vi>; using pii = std::pair<ll,ll>; #define rep(i,j,k) for(ll i=ll(j); i<ll(k); i++) #define REP(i,j,k) for(ll i=ll(j); i<=ll(k); i++) #define per(i,j,k) for(ll i=ll(j); i>=ll(k); i--) #define ln "\n" #define all(a) a.begin(), a.end() #define pb emplace_back #define mp std::make_pair constexpr ll inf = (1ll<<60); void construct_instructions(int s, int n, int k, int q) { if(s == 0){ constexpr ll base = 90, allone = 91; constexpr ll mb = 2000; { vector<bool> v(mb); rep(i,1,mb){ if(i%k == 0) v[i] = 1; } append_store(base,v); } { vector<bool> v(mb); rep(i,n*k,mb){ v[i] = 1; } append_store(allone,v); append_or(0,0,allone); } while(n > 1){ ll half = n/2; append_right(1, 0, half*k); append_print(0); append_print(1); append_not(2,1); append_add(3,0,2); append_xor(4,0,1); append_xor(5,3,4); append_and(6,base,5); ll lk = 1; while(lk < k) lk *= 2; if(lk != k){ lk /= 2; append_right(7,6,k-lk); append_or(6,6,7); } while(lk > 1){ append_right(7,6,lk/2); append_or(6,6,7); lk /= 2; } /*append_left(7,6,2); append_or(6,6,7); append_left(7,6,4); append_or(6,6,7); append_left(7,6,2); append_or(6,6,7); append_left(7,6,1); append_or(6,6,7);*/ append_right(6,6,1); append_and(7,0,6); append_print(6); append_not(6,6); append_print(6); append_and(8,1,6); append_print(7); append_print(8); append_or(0,7,8); n = (n+1)/2; } } else{ constexpr ll base = 90, allone = 91; constexpr ll mb = 2000; { vector<bool> v(mb); rep(i,1,mb){ if(i%k == 0) v[i] = 1; } append_store(base,v); } { vector<bool> v(mb); rep(i,n*k,mb){ v[i] = 1; } append_store(allone,v); append_or(0,0,allone); } constexpr ll ok = 99, remain = 98, mem = 97, extract = 96, modk = 95; { vector<bool> v(mb); rep(i,0,k){ v[i] = 1; } append_store(extract,v); } { vector<bool> v(mb); rep(i,0,mb){ if(i%k == 0) v[i] = 1; } append_store(modk,v); } append_move(remain, 0); per(t,n,1){ append_move(0,remain); ll nn = n; while(nn > 1){ ll half = nn/2; append_right(1, 0, half*k); append_not(2,1); append_add(3,0,2); append_xor(4,0,1); append_xor(5,3,4); append_and(6,base,5); ll lk = 1; while(lk < k) lk *= 2; if(lk != k){ lk /= 2; append_right(7,6,k-lk); append_or(6,6,7); } while(lk > 1){ append_right(7,6,lk/2); append_or(6,6,7); lk /= 2; } /*append_left(7,6,2); append_or(6,6,7); append_left(7,6,4); append_or(6,6,7); append_left(7,6,2); append_or(6,6,7); append_left(7,6,1); append_or(6,6,7);*/ append_right(6,6,1); append_and(7,0,6); append_not(6,6); append_and(8,1,6); append_or(0,7,8); nn = (nn+1)/2; } append_move(mem,0); append_and(mem,mem,extract); append_print(mem); { append_move(50,mem); { vector<bool> zero(mb); append_store(51,zero); append_store(54,zero); } rep(_,0,n){ append_or(51,50,51); append_left(50,50,k); append_print(50); } append_print(51); append_xor(52,51,remain); append_not(52,52); append_print(52); append_move(53,modk); rep(_,0,k){ append_and(53,53,52); append_right(52,52,1); } rep(_,0,k){ append_or(54,53,54); append_left(53,53,1); } append_or(remain,remain,54); append_print(remain); } append_print(mem); append_left(mem,mem,(n-t)*k); append_or(ok,mem,ok); append_print(ok); } append_move(0,ok); } }
#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...