답안 #400476

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
400476 2021-05-08T06:13:30 Z galca MalnaRISC (COI21_malnarisc) C++14
100 / 100
2 ms 332 KB
#include <iostream>
#include <vector>
using namespace std;

int main() {
	int N;
	cin >> N;

	int n = N;
	while (n & (n - 1)) {
		n++;
	}

   vector<int> regs(n);
   for (int i=0; i<n; i++) {
	  regs[i] = i+1;
   }  

   vector<int> stage;
   vector<int> r1;
   vector<int> r2;

   int curr_stage = 0;

   for (int k = 2; k <= n; k *= 2) {
	   for (int j = k / 2; j > 0; j /= 2) {
		   for (int i = 0; i < n; i++) {
			   int ip = i ^ j;
			   if (ip > i) {
				   int reg1 = regs[i];
				   int reg2 = regs[ip];
				   if ((reg1 <= N) && (reg2 <= N)) {
					   stage.push_back(curr_stage);
					   r1.push_back(reg1);
					   r2.push_back(reg2);
					   //cout << "CMPSWP R" << reg1 << " R" << reg2 << endl;
				   }
			   }
		   }
		   ++curr_stage;
		   for (int i = 0; i < n; i++) {
			   regs[i] = i + 1;
		   }
	   }
	   int odd = 0;
	   for (int i = 0; i < n; i += k) {
		   if (odd) {
			   for (int m = 0; m < k / 2; m++) {
				   regs[i + m] = i + k - m;
				   regs[i + k - m - 1] = i + m + 1;
			   }
		   }
		   else {
			   for (int m = 0; m < k / 2; m++) {
				   regs[i + m] = i + m + 1;
				   regs[i + k - m - 1] = i + k - m;
			   }
		   }
		   odd ^= 1;
	   }
   }
   
   cout << curr_stage << endl;
   curr_stage = 0;
   for (int i = 0; i < r1.size(); i++) {
	   if (stage[i] != curr_stage) {
		   cout << endl;
	   }
	   curr_stage = stage[i];
	   cout << "CMPSWP R" << r1[i] << " R" << r2[i] << " ";
   }
   return 0;
}

Compilation message

malnarisc.cpp: In function 'int main()':
malnarisc.cpp:65:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |    for (int i = 0; i < r1.size(); i++) {
      |                    ~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 208 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 208 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct