답안 #399610

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
399610 2021-05-06T09:26:22 Z galca MalnaRISC (COI21_malnarisc) C++14
60 / 100
1 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 + N - 1); 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, reg2;
				   if ((i ^ k) < i) {
					   reg1 = regs[i];
					   reg2 = regs[ip];
				   }
				   else {
					   reg1 = regs[ip];
					   reg2 = regs[i];
				   }
				   if (reg2 > N) {
					   //cout << "reg " << reg1 << " exchanged with " << reg2 << " at stage " << curr_stage << " " << i << " " << ip << endl;
					   if (reg1 < reg2) {
						   int tmp = regs[i];
						   regs[i] = regs[ip];
						   regs[ip] = tmp;
					   }
				   }
				   else {
					   if (reg1 <= N) {
						   stage.push_back(curr_stage);
						   r1.push_back(reg2);
						   r2.push_back(reg1);
						   //cout << "CMPSWP R" << reg2 << " R" << reg1 << endl;
					   }
					   else {
						   //cout << "the order between " << reg1 << " and " << reg2 << " kept at stage " << curr_stage << endl;
					   }
				   }
			   }
		   }
		   ++curr_stage;
	   }
   }
   
   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:66:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |    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 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 Incorrect 1 ms 208 KB not sorted
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 204 KB not sorted
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 332 KB not sorted
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 332 KB not sorted
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct