(백준) Solve 10811 C++

질문


코드

#include <iostream>
#include <vector>

int main()
{
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(NULL); std::cout.tie(NULL);

	int n, m;
	std::cin >> n >> m;

	std::vector<int> arr(n);
	for (int i = 0; i < n; ++i) arr(i) = i;

	while (m > 0)
	{
		int i, j;
		std::cin >> i >> j;

		i--, j--;
		for (int k = i; k <= (j + i) / 2; ++k)
		{
			int v = arr(j - k + i);
			arr(j - k + i) = arr(k);
			arr(k) = v;
		}

		m--;
	}

	for (auto& v : arr) std::cout << v + 1 << " ";
	std::cout << "\n";

	return 0;
}

설명하다

배열을 뒤집을 때의 문제는 전체가 아니라 배열의 일부를 뒤집는 것입니다. 반전을 위해 배열의 모든 범위를 검색할 필요는 없습니다. i에서 (i+j)/2까지 검색하고 값을 변경하면 됩니다.


전체 길이의 절반만 검색하는 이유는 첫 번째 인덱스에서 k번째 값, 마지막 인덱스에서 k번째 값을 변경하기 때문에 사전 검색이 필요하지 않습니다.