-
반응형
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; }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준oj] 6549번 히스토그램에서 가장 큰 직사각형 (0) 2020.12.29 [백준oj] 12846번 무서운 아르바이트 (0) 2020.12.29 [백준oj] 1389번 케빈 베이컨의 6단계 법칙 (0) 2020.12.29 [백준oj] 1261번 알고스팟 (0) 2020.12.29 [백준oj] 1300번 k번째 수 (0) 2020.12.29 댓글