This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
const ll inf = 1e9;
const int md1 = 1e9+7;
const int md2 = 998244353;
#define sz(v) ((int)v.size())
#define pb push_back
#define pry cout << "YES\n"
#define prn cout << "NO\n"
#define endl '\n'
#define fst first
#define scn second
#define clear for (i = 0; i < B; ++i) { v[i] = 0; }
/* #define ONPC */
const int D = 99; // del extra
const int L = 98; // last bit
const int S = 97; // for sum
const int N = 96; // min
const int X = 95; // max
const int F = 94; // diff
const int T = 93; // temporary
const int B = 2000;
const int M = 100;
vector<bitset<B>> r(M);
void append_move(int t, int y);
void append_store(int t, 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 p);
void append_right(int t, int x, int p);
void append_add(int t, int x, int y);
void
fminmax(int a, int b, int k)
{
append_not(F, b);
append_and(F ,F, D);
/* append_add(F ,F, S); */
append_add(F ,F, a);
append_and(F ,F, L);
/* TODO improve */
int s = 0;
for (int j = 0; j < B; ++j) {
if ((1<<(j+1))-1 > k) break;
s = (1<<(j+1))-1;
append_right(N, F, (1<<j));
append_or(F,F,N);
}
/* for (int i = 0; i < k; ++i) { */
/* cout << r[F][i]; */
/* } */
/* cout << ' ' << s << endl; */
if (s < k) {
append_right(N, F, k-s);
append_or(F,F,N);
}
/* for (int i = 0; i < k; ++i) { */
/* cout << r[F][i]; */
/* } */
/* cout << endl; */
/* for (int i = 0; i < k+2; ++i) { */
/* cout << r[L][i]; */
/* } */
/* cout << endl; */
append_and(X, F, a);
append_and(N, F, b);
append_not(F,F);
append_and(T, F, a);
append_or(N, N, T);
append_and(T, F, b);
append_or(X, X, T);
return;
}
int
domin(int n, int k, int diff)
{
int i, j, l;
vector<bool> v(B, 0);
if (n&1) {
for (i = 0; i < k; ++i)
v[n*(k+diff) + i] = 1;
append_store(1,v);
append_or(0,0,1);
++n;
}
clear;
append_and(1, 0, D);
append_right(2, 0, k+diff);
append_and(2, 2, D);
fminmax(1,2,k);
append_move(0,N);
return n>>1;
}
void
construct_instructions(int s, int n, int k, int q)
{
int i, j, l;
assert(!s);
vector<bool> v(B, 0);
if (n&1) {
for (i = 0; i < k; ++i)
v[n*k + i] = 1;
append_store(1,v);
append_or(0,0,1);
++n;
}
clear;
for (i = 0; i < n; ++i) {
if (i&1) continue;
for (j = 0; j < k; ++j) v[i*k+j] = 1;
}
append_store(D,v); clear;
for (i = 0; i < n; ++i) {
if (i&1) continue;
v[i*k+k] = 1;
}
append_store(L,v); clear;
if (!s) {
int diff = k;
while (n>1) {
n = domin(n,k, diff-k);
diff <<= 1;
}
return;
}
/* for (i = 0; i < n; ++i) { */
/* if (i&1) continue; */
/* v[i*k] = 1; */
/* } */
/* append_store(S,v); clear; */
append_and(1, 0, D);
append_right(2, 0, k);
append_and(2, 2, D);
fminmax(1,2,k);
append_move(0,N);
return;
}
#ifdef ONPC
int op = 0;
void append_move(int t, int y){
++op;
r[t] = r[y];
}
void append_store(int t, vector<bool> v){
++op;
for (int i = 0; i < B; ++i) r[t][i] = v[i];
}
void append_and(int t, int x, int y){
++op;
r[t] = (r[x]&r[y]);
}
void append_or(int t, int x, int y){
++op;
r[t] = (r[x]|r[y]);
}
void append_xor(int t, int x, int y){
++op;
r[t] = (r[x]^r[y]);
}
void append_not(int t, int x){
++op;
r[t] = (~r[x]);
}
void append_left(int t, int x, int p){
++op;
r[t] = (r[x]<<p);
}
void append_right(int t, int x, int p){
++op;
r[t] = (r[x]>>p);
}
void append_add(int t, int x, int y){
++op;
bitset<B> tmp;
bool ex = 0;
int cnt;
for (int i = 0; i < B; ++i) {
tmp[i] = (r[x][i]^r[y][i]^ex);
cnt = 0;
if (r[x][i]) ++cnt;
if (r[y][i]) ++cnt;
if (ex) ++cnt;
ex = (cnt > 1);
}
r[t] = tmp;
}
void
solve()
{
for (int i = 0; i < M; ++i) {
for (int j = 0; j < B; ++j) {
r[i][j] = 0;
}
}
int n, k, x;
cin >> n >> k;
for (int i = 0; i < n; ++i) {
cin >> x;
for (int j = 0; j < k; ++j)
if ((x>>j)&1) r[0][i*k+j] = 1;
}
construct_instructions(0,n,k,100);
int ans = 0;
for (int i = 0; i < k; ++i) {
if (r[0][i]) ans |= (1<<i);
}
cout << ans << ' ' << op << endl;
}
int32_t
main(int argc, char **argv)
{
if (argc >= 2) {
freopen(argv[1], "r", stdin);
} else
ios_base::sync_with_stdio(0);cin.tie(0);
int t = 1;
/* cin >> t; */
while(t--)
solve();
}
#endif
Compilation message (stderr)
registers.cpp: In function 'int domin(int, int, int)':
registers.cpp:95:12: warning: unused variable 'j' [-Wunused-variable]
95 | int i, j, l;
| ^
registers.cpp:95:15: warning: unused variable 'l' [-Wunused-variable]
95 | int i, j, l;
| ^
registers.cpp: In function 'void construct_instructions(int, int, int, int)':
registers.cpp:125:15: warning: unused variable 'l' [-Wunused-variable]
125 | int i, j, l;
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |