inflearn logo
강의

Course

Instructor

Do it! Algorithm Coding Test with C++

백준11505, 교재 73번

282

sprtms53254189

3 asked

0

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

static vector<long> tree;
static int n, m, k,mod = 1000000007;
void tree_set(int a);
void change_val(int index, long val);
long gugan(int s, int e);
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> n >> m >> k;
	int q = n;
	int l = 0;
	while (q != 0) {
		q = q / 2;
		l++;
	}
	int tree_size = int(pow(2, l+1));
	int left_index = pow(2, l);
	tree.resize(tree_size);
	fill(tree.begin(), tree.end(), 1);
	for (int i = left_index; i < n+left_index; i++) {
		cin >> tree[i];
	}
	tree_set(tree_size-1);
	for (int i = 0; i < m + k; i++) {
		long a, s, e;
		cin >> a >> s >> e;

		if (a == 1) {
			change_val(s + left_index - 1, e);
		}	
		else if (a == 2) {
			long start = s + left_index - 1;
			long end = e + left_index - 1;
			long result = gugan(start, end);
			cout<<result<<'\n';
		}
	}

}
long gugan(int s, int e) {
	long part_sum = 1;
	while (s <= e) {
		if (s % 2 == 1) {
			part_sum *= tree[s]%mod;
		}
		if (e % 2 == 0) {
			part_sum *= tree[e]%mod;
		}
		s = (s + 1) / 2;
		e = (e - 1) / 2;
	}
	return part_sum;
}
void change_val(int index, long val) {
	tree[index] = val;
	while (index > 1) {
		index = index / 2;
		tree[index] = tree[index*2]%mod*tree[index*2+1]%mod;
	}
}
void tree_set(int a) {
	while (a != 1) {
		tree[a / 2] *= tree[a]%mod;
		a--;
	}
}

 

위의 방법으로 코드를짜서 제출했더니 출력초과가 발생합니다. 왜 이런오류가 발생하는지 모르겠습니다..

c++ 코딩-테스트 알고리즘

Answer 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.
님께서 공유해주신 코드는 세그먼트 트리를 사용하여 구간 곱을 계산하는 방식으로 보입니다.

‘출력 초과’ 라는 오류는 범위를 벗어난 과도한 출력이 발생했을 때 나타나는 오류로, 일반적인 상황에서는 코드 내에서 불필요한 출력이 발생하지 않았는지 확인해야 합니다. 그러나 여기에서는 코드 자체에서 불필요한 출력이 없어 보이며, 근본적인 원인보다는 문제의 조건이나 제출 환경에 대해서 고려해볼 필요가 있습니다.

문제의 조건이나 세그먼트 트리의 구현 방식에 오류가 있을 수도 있기 때문에 다음 점들을 확인해 보시는 것이 좋을 것 같습니다:
1. 세그먼트 트리의 크기와 초기화가 올바르게 이루어졌는지 확인해보세요.
2. 구간 곱을 계산하는 ‘gugan’ 함수에서 모듈로 연산을 적절하게 사용했는지 다시 검토해보세요.
3. ‘change_val’ 함수에서 세그먼트 트리를 업데이트 하는 로직이 제대로 동작하는지 점검해보세요.
4. 입출력에 대한 처리가 문제와 일치하는지 검토하세요. 예를 들어, 문제에서 요구하는 출력 포맷과 다르게 출력하고 있지는 않은지 확인해보세요.

질문하신 문제의 정확한 해결을 위해서는 조금 더 많은 정보가 필요합니다. 올바른 입력 범위, 문제의 조건 등에 대해 문제가 발생하지 않도록 주의를 기울여 서브밋 해보시길 바랍니다.

수강평 이벤트

0

15

2

Reticle이 안나옵니다.

0

5

1

진행 방법 질문드립니다!

0

23

2

안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.

0

18

1

Singleton 관련 질문입니다.

1

27

2

갑자기 채점 사이트가 바뀌었어요

0

19

1

42. [세그먼트 트리 실전 문제] 구간 합 구하기3 (백준 2042)

0

64

1

10986번 질문 있습니다!

0

45

0

LCA 빠르게 찾기 - 트리의 높이에 따른 k값 질문

0

119

0

백준 1377 질문있습니다

0

218

1

백준 1722 교재 81 질문

0

330

1

백주 1456번

0

200

1

백준 1325, 교재 47번 문제 질문입니다.

0

358

1

백준 11404 플로이드 문제 질문있습니다.

0

260

1

문제 85번 질문드립니다

0

322

1

백준 13023 질문있습니다.

0

204

1

문제 8번 질문드립니

0

305

1

백준 1876여행 유니온 파인드 질문있습니다.

0

241

1

백준 2251 C++ 질문 있습니다.

0

398

2

퀵정렬 질문

3

291

1

i==k일떄 i++안해도되지않나요

0

436

1

알고리즘 코딩테스트 문제풀이 강의 - 14 절댓값 힙 구현하기 (백준 11286)

0

550

1

알고리즘 코딩테스트 문제풀이 강의 - 9 DNA 비밀번호 (백준 12891)

1

573

1

C++은 실전문제에 대한 강의가 없나요? 자바나 파이썬은 있는데 없는거 같아서요.

2

591

2