백준 5676번: 음주 코딩

Seungil Kim·2021년 12월 6일
0

PS

목록 보기
126/206

음주 코딩

백준 5676번: 음주 코딩

아이디어

그냥 곱하면 long long도 터져서 안되니까 1, 0, -1으로 바꿔서 곱해주면 된다!

코드

#include <bits/stdc++.h>

using namespace std;

int N, K;
vector<int> arr, tree;

int init(int start, int end, int node) {
    if (start == end) return tree[node] = arr[start];
    return tree[node] = init(start, (start+end)/2, node*2) * init((start+end)/2+1, end, node*2+1);
}

int update(int start, int end, int idx, int value, int node) {
    if (idx < start || end < idx) return tree[node];
    if (start == end) return tree[node] = value;
    return tree[node] = update(start, (start+end)/2, idx, value, node*2) * update((start+end)/2+1, end, idx, value, node*2+1);
}

int query(int start, int end, int left, int right, int node) {
    if (end < left || right < start) return 1;
    if (left <= start && end <= right) return tree[node];
    return query(start, (start+end)/2, left, right, node*2) * query((start+end)/2+1, end, left, right, node*2+1);
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    while (cin >> N >> K) {
        arr = vector<int>(N, 0);
        tree = vector<int>(4*N, 0);
        for (int i = 0; i < N; i++) {
            cin >> arr[i];
            if (arr[i] > 0) arr[i] = 1;
            else if (arr[i] < 0) arr[i] = -1;
            else arr[i] = 0;
        }
        init(0, N-1, 1);
        for (int i = 0; i < K; i++) {
            char q;
            int a, b;
            cin >> q >> a >> b;
            if (q == 'C') {
                if (b > 0) b = 1;
                else if (b < 0) b = -1;
                else b = 0;
                arr[a-1] = b;
                update(0, N-1, a-1, b, 1);
            }
            else if (q == 'P') {
                int n = query(0, N-1, a-1, b-1, 1);
                if (n > 0) cout << '+';
                else if (n < 0) cout << '-';
                else cout << '0';
            }
        }
        cout << '\n';
    }
    return 0;
}

여담

EOF까지 입력받을 때 while(cin >> x)를 사용하면 된다. 거짓을 반환하기 때문.
update를 void가 아니라 반환형으로 짤 때 인덱스 범위를 벗어난 경우 tree[node]를 반환해주면 된다.
문제의 힌트가 아주 맘에 든다.

아 술먹고싶다 빨리 휴가나가야지

profile
블로그 옮겼어용 https://ks1ksi.io/

2개의 댓글

comment-user-thumbnail
2021년 12월 10일

휴가 때 음주코딩?

1개의 답글