안녕하세요. 오늘은 수열을 돌릴 거예요.

문제

https://www.acmicpc.net/problem/31563

아이디어

배열을 돌릴 수는 없으므로 [Left,Right]를 돌립시다. 그러면 sum배열 하나만으로도 해결이 가능합니다.
type가 1이면 K에 N-x를 더해줍시다. 이때 x를 빼는것이 아닌 N-x를 더해주는 이유는 K가 음수이면 곤란해지기 때문입니다.

소스코드

#include <iostream>
#define ll long long
using namespace std;

ll sum[202020] = { 0 };

int main(void)
{
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	ll Left, Right, K = 0, x, type, i, N, M;

	cin >> N >> M;
	for (i = 1; i <= N; i++)
	{
		cin >> x;
		sum[i] = sum[i - 1] + x;
	}

	for (i = 0; i < M; i++)
	{
		cin >> type;
		if (type == 1)
		{
			cin >> x;
			K += N - x;
		}
		if (type == 2)
		{
			cin >> x;
			K += x;
		}
		if (type == 3)
		{
			cin >> Left >> Right;
			Left = (Left + K - 1) % N + 1;
			Right = (Right + K - 1) % N + 1;
			if (Left <= Right) cout << sum[Right] - sum[Left - 1] << "\n";
			else cout << sum[N] - sum[Left - 1] + sum[Right] << "\n";
		}
	}
}


감사합니다.

0개의 댓글