제출 #1335307

#제출 시각아이디문제언어결과실행 시간메모리
1335307Jawad_Akbar_JJSob (COCI19_sob)C++20
110 / 110
56 ms12968 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> case1(int n, int m){
	vector<pair<int, int>> v2;
	vector<int> ans;
	for (int i=m;i<m+n;i++)
		v2.push_back({i % n, i});
	sort(begin(v2), end(v2));
	for (int i=0;i<n;i++)
		ans.push_back(v2[i].second);
	return ans;
}

vector<int> solve(int n, int m){
	int b = 31 - __builtin_clz(n), b1 = m & (1<<b), b2 = (m + n - 1) & (1<<b);
	int rem = n - (1<<b), all1 = (1<<b) - 1, r1 = (m + n) % (1<<b);
	if ((1<<b) == n)
		return case1(n, m);
		
	vector<int> A, B;
	if (b1 != 0 and b2 == 0){
		A = solve((1<<b), m + rem);
		B = solve(rem, m);
	}
	else if (b1 != 0 and b2 != 0){
		A = solve((1<<b), m + rem - r1);
		B = solve(rem, m);

		for (int i=0;i<B.size();i++){
			if ((B[i] & all1) < r1)
				B[i] += (1<<b);
		}
	}
	else if (b1 == 0 and b2 == 0){
		A = solve((1<<b), m);
		B = solve(rem, m + (1<<b));
		
		for (int i=0;i<A.size();i++){
			if ((A[i] & all1) < r1)
				A[i] += (1<<b);
		}
		for (int i=0;i<B.size();i++){
			if ((B[i] & all1) < r1)
				B[i] -= (1<<b);
		}
	}
	else if (b1 == 0 and b2 != 0){
		A = solve((1<<b), m);
		B = solve(rem, m + (1<<b));
	}

	A.insert(end(A), begin(B), end(B));
	return A;
}

int main(){
	int n, m;
	cin>>n>>m;

	vector<int> vec = solve(n, m);

	for (int i=0;i<n;i++)
		cout<<i<<' '<<vec[i]<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...