Submission #439319

# Submission time Handle Problem Language Result Execution time Memory
439319 2021-06-29T15:15:31 Z rainboy Bit Shift Registers (IOI21_registers) C++17
75 / 100
9 ms 1148 KB
#include "registers.h"
#include <vector>

using namespace std;

typedef vector<bool> vb;

const int N = 128, L = 7, B = 2000;

void construct_instructions(int s, int n, int k, int q) {
	int h, i, u, v, l;

	if (s == 0) {
		vb aa(B, 0), bit(B, 0);

		for (i = n; i < N; i++)
			aa[i * k + k - 1] = 1;
		bit[k - 1] = 1;
		append_store(1, aa), append_store(6, bit);
		for (h = k - 1; h >= 0; h--) {
			append_or(2, 0, 1), append_right(3, 2, k), append_and(3, 3, 2);
			if (n > 2)
				for (l = 1; l < L; l++)
					append_right(4, 3, k << l), append_and(3, 3, 4);
			append_and(3, 3, 6);
			append_or(5, 5, 3);
			if (h > 0) {
				for (l = 0; l < L; l++)
					if (l == 0 || n > 2)
						append_left(4, 3, k << l), append_or(3, 3, 4);
				append_not(3, 3), append_and(2, 2, 3), append_or(1, 1, 2);
				append_right(1, 1, 1), append_right(6, 6, 1);
			}
		}
		append_move(0, 5);
	} else {
		vb uu(B, 0);
		int h, l, l_;

		for (l = 0; l < L; l++) {
			if (l > 0)
				for (u = 0; u < N; u++) {
					if ((u & 1 << l) != 0 && (u & 1 << l - 1) == 0) {
						v = u ^ (1 << l) - 1;
						for (h = 0; h < B; h++)
							uu[h] = h / k == u;
						append_store(50, uu);
						append_right(1, 0, (v - u) * k), append_xor(1, 0, 1);
						append_and(1, 1, 50);
						append_left(2, 1, (v - u) * k);
						append_or(1, 1, 2);
						append_xor(0, 0, 1);
					}
				}
			for (l_ = l; l_ >= 0; l_--) {
				append_right(1, 0, k << l_);
				append_xor(2, 0, 1);
				append_not(1, 1), append_and(3, 0, 1), append_or(4, 0, 1), append_not(1, 1);
				append_move(5, 99);
				for (h = 0; h < k; h++) {
					append_or(5, 5, 3), append_and(5, 5, 4);
					if (h + 1 < k)
						append_left(5, 5, 1);
					else
						append_right(5, 5, k - 1);
				}
				for (u = 0; u < N; u++)
					for (h = 0; h < k; h++)
						uu[u * k + h] = (u & 1 << l_) == 0 && h == 0;
				append_store(75, uu), append_and(5, 5, 75);
				for (h = 0; h + 1 < k; h++)
					append_left(6, 5, 1), append_or(5, 5, 6);
				for (u = 0; u < N; u++)
					for (h = 0; h < k; h++)
						uu[u * k + h] = (u & 1 << l_) == 0;
				append_and(5, 5, 2);
				append_store(75, uu), append_and(5, 5, 75);
				append_left(6, 5, k << l_), append_or(5, 5, 6);
				append_xor(0, 0, 5);
			}
		}
		append_right(0, 0, (N - n) * k);
	}
}

Compilation message

registers.cpp: In function 'void construct_instructions(int, int, int, int)':
registers.cpp:43:43: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   43 |      if ((u & 1 << l) != 0 && (u & 1 << l - 1) == 0) {
      |                                         ~~^~~
registers.cpp:44:24: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
   44 |       v = u ^ (1 << l) - 1;
      |               ~~~~~~~~~^~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 204 KB Wrong answer detected in grader
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 8 ms 1056 KB Output is correct
2 Correct 8 ms 1060 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 8 ms 1056 KB Output is correct
2 Correct 8 ms 1060 KB Output is correct
3 Correct 9 ms 1056 KB Output is correct
4 Correct 9 ms 1124 KB Output is correct
5 Correct 8 ms 1056 KB Output is correct
6 Correct 7 ms 1056 KB Output is correct
7 Correct 7 ms 1148 KB Output is correct