문제풀이/백준oj
[백준oj] 5676번 음주코딩
Hyeon-Uk
2020. 12. 29. 19:10
반응형
5676번: 음주 코딩
각 테스트 케이스마다 곱셈 명령의 결과를 한 줄에 모두 출력하면 된다. 출력하는 i번째 문자는 i번째 곱셈 명령의 결과이다. 양수인 경우에는 +, 음수인 경우에는 -, 영인 경우에는 0을 출력한다.
www.acmicpc.net
간단한 세그먼트 트리구현 문제이다. 세그먼트트리 구간합을 구간 곱으로 적용을 해준다.
하지만 입력 받은 수 그대로 입력한다면, 오버플로우가 생길 수 있다. 문제에서 요구하는 출력은 음수인지 양수인지 0인지가 궁금한것이니 입력받을때 양수는1, 음수는 -1,0은 0으로 입력받아 구간곱으로 부호확인만 해주면된다.
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
long long tree[4*100001];
//초기화 겸 업데이트
int init(int st, int end, int node, int position,int value) {
if (st > position || end < position) return tree[node];
if (st == end) {
return tree[node] = value;
}
int middle = (st + end)>>1;
return tree[node] = init(st, middle, node * 2,position,value) * init(middle + 1, end, node * 2 + 1,position,value);
}
//구간 곱 구하는부분
int mul(int st, int end, int node, int l, int r) {
//범위 밖이면 곱이니 1 리턴
if (end < l || r < st) {
return 1;
}
//범위안이면 해당 곱 리턴
if (l <= st && end <= r) {
return tree[node];
}
int middle = (st + end)>>1;
return mul(st, middle, node * 2, l, r) * mul(middle + 1, end, node * 2 + 1, l, r);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int n, k;
char op;
int a, b;
int result;
while(cin>>n>>k){
int d;
for (int i = 0; i < n; i++) {
cin>>d;
if (d > 0) init(0, n - 1, 1, i,1);
else if (d < 0) init(0, n - 1, 1,i, -1);
else init(0, n - 1, 1,i, 0);
}
for (int j = 0; j < k; j++) {
cin >> op>>a>>b;
if (op == 'C') {
if (b > 0) init(0, n - 1, 1,a-1, 1);
else if (b < 0) init(0, n - 1, 1,a-1, -1);
else init(0, n - 1, 1, a-1,0);
}
else {
result=mul(0, n - 1, 1, a-1,b-1);
if (result> 0) {
cout << "+";
}
else if (result<0) {
cout << "-";
}
else {
cout << "0";
}
}
}
cout << "\n";
}
return 0;
}
반응형