Skip to content

Conversation

@g0rnn
Copy link
Collaborator

@g0rnn g0rnn commented Aug 3, 2025

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

์Œ์ฃผ ์ฝ”๋”ฉ

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

40m

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

์–ด๋””์„ ๊ฐ€ ๋ณธ์ ์žˆ๋Š” ์œ ํ˜•์ด์ฃ ? ๋ฐฐ์—ด์˜ ํŠน์ • ๊ตฌ๊ฐ„์„ ๊ณฑํ•˜๊ฑฐ๋‚˜, ํŠน์ • idx์˜ ๊ฐ’์„ ๋ฐ”๊ฟ”์•ผํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ €๋ฒˆ PR ์— ์˜ฌ๋ ธ๋˜ ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ €๋ฒˆ ๋ฌธ์ œ๊ฐ€ ๋„ˆ๋ฌด ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋งŒ์„ ์œ„ํ•œ ๋ฌธ์ œ ๊ฐ™์•˜๊ธฐ์— ์ข€ ์•„์‰ฌ์›Œ์„œ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ ธ์™€๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์ด๊ฒƒ๋„ ์ข€ ๊ทธ๋Ÿฐ๋А๋‚Œ์ด๋„ค์š”..ใ…œ

์ด๋ฒˆ์—๋„ ์ „์ฒด์ ์ธ ๊ตฌ์กฐ๋Š” ๊ฐ™์Šต๋‹ˆ๋‹ค. ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ , update ํ•˜๊ฑฐ๋‚˜ queryํ•˜๋Š” ๊ฑฐ์ฃ .

๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š”๋ฐ ์•ฝ๊ฐ„์˜ ํŒ์„ ๋“œ๋ฆฌ์ž๋ฉด ๊ณฑ์…ˆ์„ ์ผ์ผ์ด ๋‹ค ํ•ด์ฃผ๊ธฐ ํž˜๋“œ๋‹ˆ 1, 0, -1๋กœ ์น˜ํ™˜ํ•œ ํ›„ ๊ณฑ์…ˆ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :)

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

Copy link
Collaborator

@kangrae-jo kangrae-jo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋ฐœ๋จธ์˜ ํ”ผํฌ ์ด๋ก (Ballmer's Peak Theory)์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ํ˜ˆ์ค‘ ์•Œ์ฝœ ๋†๋„๊ฐ€ 0.129% ์™€ 0.138% ์‚ฌ์ด์ผ ๋•Œ ์ดˆ์ธ์ ์ธ ์ฝ”๋”ฉ ์‹ค๋ ฅ์„ ๋ฐœํœ˜ํ•œ๋‹ค๋Š” ์ด๋ก ์ด๋‹ค.

์ €๋„ ์ˆ  ํ•œ์žฅํ•˜๊ณ  ์ฝ”๋”ฉํ•˜๋Š”์ฃผ์ž…ใ„ด๋””ใ….
์ž˜ ๋˜๋Š”๊ฑฐ ใ……๊ฐ™๋„ค์š”ใ…•.

์žฅ๋‚œ์ด๊ตฌ์š”. ์˜ค๋Š˜๋„ ์žฌ๋ฐŒ๋Š” ์„ธ๊ทธ๋จผํŠธํŠธ๋ฆฌ ๋ฌธ์ œ๋ฅผ ๋“ค๊ณ ์™€์ฃผ์…จ๊ตฐ์š”.
์ €๋ฒˆ์— ํ–ˆ๋˜ ์„ธ๊ทธ๋จผํŠธ ๊ตฌ์กฐ๊ฐ€ ์•„์ง ์ฒดํ™”๋˜์ง€์•Š์•„์„œ.. ์ด์ „ ๋ฌธ์ œ๋ฅผ ์กฐ๊ธˆ ์ปจ๋‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ง์…ˆ์˜ ํ•ญ๋“ฑ์›์€ 0์ด๋ผ๋Š” ์ ๊ณผ ๊ณฑ์…ˆ์˜ ํ•ญ๋“ฑ์›์€ 1์ด๋ผ๋Š” ์ ๋งŒ ์ฃผ์˜ํ•˜๋ฉด์„œ ์ฝ”๋”ฉ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  X์— ๋“ค์–ด๊ฐˆ ์ˆซ์ž๋“ค์„ 1,0,-1๋กœ ๋ณ€๊ฒฝํ•ด๋‘๋Š” ์•„์ด๋””์–ด๋„ ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ์„ธ๊ทธ๋จผํŠธ๋Š” ์–ด๋ ต๋„ค์š”.
๋‹ค์Œ ๋ฌธ์ œ๋กœ ๋‚˜์˜ค๋ฉด ์ง„์งœ์ง„์งœ ๋งž์ถฐ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#include <iostream>
#include <vector>

using namespace std;

vector<int> X;
vector<int> tree;

int makeTree(int start, int end, int node) {
    if (start == end) return tree[node] = X[start];

    int mid = (start + end) / 2;
    return tree[node] = makeTree(start, mid, node * 2) *
                        makeTree(mid + 1, end, node * 2 + 1);
}

void updateTree(int start, int end, int node, int index, int V) {
    if (index < start || index > end) return;

    if (start == end) {
        tree[node] = V;
        return;
    }

    int mid = (start + end) / 2;
    updateTree(start, mid, node * 2, index, V);
    updateTree(mid + 1, end, node * 2 + 1, index, V);
    tree[node] = tree[node * 2] * tree[node * 2 + 1];
}

int solution(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];

    int mid = (start + end) / 2;
    return solution(start, mid, left, right, node * 2) *
           solution(mid + 1, end, left, right, node * 2 + 1);
}

int main() {
    ios_base::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);

    int N, K;
    while (cin >> N >> K) {
        X.assign(N + 1, 0);
        for (int i = 1; i <= N; i++) {
            int temp;
            cin >> temp;
            if (temp == 0) X[i] = 0;
            else if (temp > 0) X[i] = 1;
            else X[i] = -1;
        }

        tree.assign(4 * N + 4, 1);
        makeTree(1, N, 1);

        vector<char> answer;
        while (K--) {
            char command;
            cin >> command;

            if (command == 'C') {
                int i, V;
                cin >> i >> V;
                if (V > 0) V = 1;
                else if (V < 0) V = -1;
                updateTree(1, N, 1, i, V);
            } else if (command == 'P') {
                int i, j;
                cin >> i >> j;
                int temp = solution(1, N, i, j, 1);
                if (temp == 0) answer.push_back('0');
                else if (temp > 0) answer.push_back('+');
                else answer.push_back('-');
            }
        }

        for (char c : answer) cout << c;
        cout << '\n';
    }

    return 0;
}

Comment on lines +4 to +10
def minimize(x):
if x > 0:
return 1
elif x < 0:
return -1
else:
return 0
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ €๋Š” ์ด๊ฑฐ ํ•จ์ˆ˜ํ™” ํ•˜๋ ค๋‹ค๊ฐ€ ๋ง์•˜๋Š”๋ฐ... ๊ตฟ์ž…๋‹ˆ๋‹ค.

Copy link
Collaborator

@kokeunho kokeunho left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋„ˆ๋ฌด ์–ด๋ ต์๋‹ˆ๋‹ค...

์ €๋ฒˆ์— ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ๋ฐฐ์› ๊ธด ํ•˜์ง€๋งŒ
์•„์ง ํ˜ผ์ž ๊ตฌํ˜„์€ ์–ด๋ ต๋„ค์š”
๊ทธ๋ž˜์„œ ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ๊ฑฐ์˜ ์ œ ์ฝ”๋“œ๋Š” ์•„๋‹Œ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค..

๊ทธ๋ฆฌ๊ณ  ๋“ค์–ด์˜ค๋Š” ๋ช…๋ น์ด C๋ƒ P๋ƒ์— ๋”ฐ๋ผ์„œ
๊ทธ ๋’ค์˜ ๊ฐ’์ด ๋ณ€๊ฒฝํ•  ๊ฐ’์ธ์ง€ j(์ธ๋ฑ์Šค)์ธ์ง€๋กœ ๋‚˜๋‰˜์–ด์„œ
๊ตฌํ˜„์—์„œ ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„์„ ์‹ ๊ฒฝ์จ์•ผํ•ด์„œ ๋” ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.

์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ๋” ์—ฐ์Šตํ•ด์„œ ์™„์ „ํžˆ ์ฒด๋“ํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค
์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค.

Details

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int N, K;
    static int[] tree;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        StringBuilder sb = new StringBuilder();

        while (true) {
            line = br.readLine();
            if (line == null || line.isEmpty()) break;
            StringTokenizer st = new StringTokenizer(line);
            N = Integer.parseInt(st.nextToken());
            K = Integer.parseInt(st.nextToken());

            int[] arr = new int[N];
            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < N; i++) arr[i] = Integer.parseInt(st.nextToken());

            tree = new int[4 * N];
            init(1, 0, N-1, arr);

            StringBuilder lineSb = new StringBuilder();
            for (int i = 0; i < K; i++) {
                st = new StringTokenizer(br.readLine());
                String cmd = st.nextToken();
                int a = Integer.parseInt(st.nextToken()) - 1;
                int b = Integer.parseInt(st.nextToken());

                if (cmd.equals("C")) {
                    update(1, 0, N-1, a, b);
                } else {
                    int response = query(1, 0, N-1, a, b-1);
                    if (response > 0) lineSb.append('+');
                    else if (response < 0) lineSb.append('-');
                    else lineSb.append('0');
                }
            }

            sb.append(lineSb).append("\n");
        }
        System.out.print(sb);
    }
    static void init(int node, int start, int end, int[] arr) {
        if (start == end) {
            tree[node] = Integer.compare(arr[start], 0);
        } else {
            int mid = (start + end) / 2;
            init(node*2, start, mid, arr);
            init(node*2+1, mid+1, end, arr);
            tree[node] = tree[node*2] * tree[node*2+1];
        }
    }
    static void update(int node, int start, int end, int idx, int val) {
        if (idx < start || idx > end) return;
        if (start == end) {
            tree[node] = Integer.compare(val, 0);
        } else {
            int mid = (start + end) / 2;
            update(node*2, start, mid, idx, val);
            update(node*2+1, mid+1, end, idx, val);
            tree[node] = tree[node*2] * tree[node*2+1];
        }
    }
    static int query(int node, int start, int end, int left, int right) {
        if (right < start || end < left) return 1;
        if (left <= start && end <= right) return tree[node];
        int mid = (start + end) / 2;
        return query(node*2, start, mid, left, right) * query(node*2+1, mid+1, end, left, right);
    }
}

Copy link
Member

@9kyo-hwang 9kyo-hwang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์–ด๋–ป๊ฒŒ๋“  ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ์•ˆ์“ฐ๊ณ ์ž... ์ด๋ฒˆ์—๋„ Sqrt Decomposition ๊ธฐ๋ฒ•์„ ๋“ค๊ณ ์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ณฑ ์ฒ˜๋ฆฌ๊ฐ€ ๊ณจ๋•Œ๋ ค์„œ ์–ด๋–ป๊ฒŒ ํ•˜์ง€... ํ•˜๋‹ค๊ฐ€ GPTํ•œํ…Œ ํžŒํŠธ ์–ป๊ณ  ํ•ด๊ฒฐํ–ˆ๋„ค์š”.

์‹ค์ œ ์—ฐ์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์•Œ ํ•„์š” ์—†์ด [0์ด๋ƒ -1์ด๋ƒ 1์ด๋ƒ] ํŒ๋‹จ๋งŒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋˜๋‹ˆ, ์• ์ดˆ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ -1/0/1๋กœ ์••์ถ•ํ•ด์„œ ๋“ค๊ณ  ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฐ์‚ฐ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” -1๊ณผ 0 ๊ฐœ์ˆ˜๋ฅผ ๋“ค๊ณ  ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

inline int Comp(ll x) {
    if(x > 0) {
        return 1;
    } else if(x < 0) {
        return -1;
    } else {
        return 0;
    }
}

void Init(int& B, int& NB) {
    X.resize(N);
    
    B = max(1, (int)sqrt(N));  // ๋ธ”๋ก ํฌ๊ธฐ
    NB = (N + B - 1) / B;  // ๋ธ”๋ก ๊ฐœ์ˆ˜
    
    zeroCnts.assign(NB, 0);
    negCnts.assign(NB, 0);
    
    for(int i = 0; i < N; ++i) {
        ll x; cin >> x;
        X[i] = Comp(x);
        
        int b = i / B;
        if(X[i] == 0) {
            zeroCnts[b]++;  // ํ•ด๋‹น ๊ตฌ๊ฐ„ 0 ๊ฐœ์ˆ˜ ๋ˆ„์ 
        } else if(X[i] < 0) {
            negCnts[b]++;  // ํ•ด๋‹น ๊ตฌ๊ฐ„ ์Œ์ˆ˜ ๊ฐœ์ˆ˜ ๋ˆ„์ 
        }
    }
}

๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ฟผ๋ฆฌ๋Š” ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ์›๋ณธ ๋ฐฐ์—ด๊ฐ’๊ณผ 0 ๊ฐœ์ˆ˜/์Œ์ˆ˜ ๊ฐœ์ˆ˜ ๋ฐฐ์—ด์„ ์ ์ ˆํžˆ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

void Change(const int B, int i, ll V) {
    int val = Comp(V);
    if(X[i] == val) {  // ๊ฐ™์œผ๋ฉด ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
        return;
    }
    
    // ๊ธฐ์กด ์ •๋ณด ๋‚ ๋ฆฌ๊ธฐ
    int b = i / B;
    if(X[i] == 0) {
        zeroCnts[b]--;
    } else if(X[i] < 0) {
        negCnts[b]--;
    }
    
    // ์ƒˆ๋กœ์šด ์ •๋ณด ๊ธฐ๋ก
    X[i] = val;
    if(X[i] == 0) {
        zeroCnts[b]++;
    } else if(X[i] < 0) {
        negCnts[b]++;
    }
}

๊ณฑ ์—ฐ์‚ฐ์€ ๊ตฌ๊ฐ„์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋˜๋Š”๋ฐ์š”, i ~ j ๋ถ€๋ถ„ ๊ตฌ๊ฐ„์ด ์ฃผ์–ด์ง€๋ฉด [์‹ค์ œ ๋ฐฐ์—ด๋กœ ์ฒ˜๋ฆฌํ•  ์™ผ์ชฝ ์žํˆฌ๋ฆฌ][ ๋ธ”๋ก ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•  ๊ฐ€์šด๋ฐ ][์‹ค์ œ ๋ฐฐ์—ด๋กœ ์ฒ˜๋ฆฌํ•  ์˜ค๋ฅธ์ชฝ ์žํˆฌ๋ฆฌ] 3 ๊ตฌ๊ฐ„์œผ๋กœ ๋‚˜๋ˆ ์„œ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ i, j๊ฐ€ ๊ฐ™์€ ๋ธ”๋ก์— ์†ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋งŒ ํ•ด์ฃผ๋ฉด ๋˜์ฃ .

void Product(const int B, const int i, const int j, string& out) {
    bool zero = false; int neg = 0;
    int bi = i / B, bj = j / B;
    
    if(bi == bj) {
        for(int idx = i; idx <= j; ++idx) {
            if(X[idx] == 0) {  // 0์ด๋ฉด ๊ฒฐ๊ณผ๊ฐ€ 0์ด๋‹ˆ ์ฆ‰์‹œ break
                zero = true;
                break;
            }
            
            if(X[idx] < 0) {  // ์Œ์ˆ˜ ๊ฐœ์ˆ˜ ์นด์šดํŒ…
                neg++;
            }
        }
        
        if(zero) {
            out.push_back('0');
        } else {  // ์Œ์ˆ˜ ๊ฐœ์ˆ˜๊ฐ€ ํ™€์ˆ˜๋ฉด -, ์ง์ˆ˜๋ผ๋ฉด +
            out.push_back((neg & 1) ? '-' : '+');
        }
        
        return;
    }
    
    // ์™ผ์ชฝ ์žํˆฌ๋ฆฌ ์˜์—ญ
    for(int idx = i; idx < (bi + 1) * B; ++idx) {
        if(X[idx] == 0) {
            zero = true;
            break;
        }
        
        if(X[idx] < 0) {
            neg++;
        }
    }
    
    // ๊ฐ€์šด๋ฐ ๋ธ”๋ก ์˜์—ญ
    for(int b = bi + 1; b < bj && !zero; ++b) {
        if(zeroCnts[b] > 0) {
            zero = true;
            break;
        }
        
        neg += negCnts[b];
    }
    
    // ์˜ค๋ฅธ์ชฝ ์žํˆฌ๋ฆฌ ์˜์—ญ
    for(int idx = bj * B; idx <= j && !zero; ++idx) {
        if(X[idx] == 0) {
            zero = true;
            break;
        }
        
        if(X[idx] < 0) {
            neg++;
        }
    }
    
    if(zero) {
        out.push_back('0');
    } else {
        out.push_back((neg & 1) ? '-' : '+');
    }
    
    return;
}
์ „์ฒด ์ฝ”๋“œ

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

inline int Comp(ll x) {
    if(x > 0) {
        return 1;
    } else if(x < 0) {
        return -1;
    } else {
        return 0;
    }
}

int N, K;
vector<int> X;
vector<int> zeroCnts;
vector<int> negCnts;
        
void Init(int& B, int& NB) {
    X.resize(N);
    
    B = max(1, (int)sqrt(N));
    NB = (N + B - 1) / B;
    
    zeroCnts.assign(NB, 0);
    negCnts.assign(NB, 0);
    
    for(int i = 0; i < N; ++i) {
        ll x; cin >> x;
        X[i] = Comp(x);
        
        int b = i / B;
        if(X[i] == 0) {
            zeroCnts[b]++;
        } else if(X[i] < 0) {
            negCnts[b]++;
        }
    }
}

void Change(const int B, int i, ll V) {
    int val = Comp(V);
    if(X[i] == val) {
        return;
    }
    
    int b = i / B;
    if(X[i] == 0) {
        zeroCnts[b]--;
    } else if(X[i] < 0) {
        negCnts[b]--;
    }
    
    X[i] = val;
    if(X[i] == 0) {
        zeroCnts[b]++;
    } else if(X[i] < 0) {
        negCnts[b]++;
    }
}

void Product(const int B, const int i, const int j, string& out) {
    bool zero = false; int neg = 0;
    int bi = i / B, bj = j / B;
    
    if(bi == bj) {
        for(int idx = i; idx <= j; ++idx) {
            if(X[idx] == 0) {
                zero = true;
                break;
            }
            
            if(X[idx] < 0) {
                neg++;
            }
        }
        
        if(zero) {
            out.push_back('0');
        } else {
            out.push_back((neg & 1) ? '-' : '+');
        }
        
        return;
    }
    
    for(int idx = i; idx < (bi + 1) * B; ++idx) {
        if(X[idx] == 0) {
            zero = true;
            break;
        }
        
        if(X[idx] < 0) {
            neg++;
        }
    }
    
    for(int b = bi + 1; b < bj && !zero; ++b) {
        if(zeroCnts[b] > 0) {
            zero = true;
            break;
        }
        
        neg += negCnts[b];
    }

    for(int idx = bj * B; idx <= j && !zero; ++idx) {
        if(X[idx] == 0) {
            zero = true;
            break;
        }
        
        if(X[idx] < 0) {
            neg++;
        }
    }

    if(zero) {
        out.push_back('0');
    } else {
        out.push_back((neg & 1) ? '-' : '+');
    }
    
    return;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    while((cin >> N >> K)) {
        int B, NB;
        Init(B, NB);
        
        string out; out.reserve(K);
        while(K--) {
            char cmd; cin >> cmd;
            if(cmd == 'C') {
                int i; ll V; cin >> i >> V;
                Change(B, i - 1, V);
            } else {
                int i, j; cin >> i >> j;
                Product(B, i - 1, j - 1, out);
            }
        }
        
        cout << out << "\n";
    }
    
    return 0;
}

Copy link
Collaborator

@wnsmir wnsmir left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i์—์„œ j๊นŒ์ง€์˜ ๊ณฑ์„ ๊ตฌํ•˜๋ผ๋Š”๊ฒƒ์„ ๋ณด๊ณ 
๊ตฌ๊ฐ„์„ ์—ฌ๋Ÿฌ๋ฒˆ ๊ณ„์‚ฐํ•ด์•ผํ•˜๋Š” ์ ์—์„œ ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ์ด ์ž์ฃผ ์ผ์–ด๋‚œ๋‹ค๋Š” ์ ์—์„œ

์ง€๋‚œ์ฃผ ํ’€์—ˆ๋˜ ์„ธ๊ทธ๋จผํŠธํŠธ๋ฆฌ๊ฐ€ ๋– ์˜ค๋ฅด๋ฉฐ ๋ณต์Šต๊ฒธ ์ด๋ฌธ์ œ๋ฅผ ๊ณจ๋ž๊ตฌ๋‚˜ ๋ผ๋Š” ์ƒ๊ฐ์ด ์Šค์ณ์ง€๋‚˜๊ฐ”์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ํŠธ๋ฆฌ ๊ตฌํ˜„ํ•˜๋ ค๋‹ˆ๊นŒ .. ์ƒ๋‹นํžˆ ์–ด๋ ต๋„ค์š”

ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋Š”์  ์ด์™ธ์—๋Š” ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋งŒ ์ด์ „์—๋Š” ๋ฆฌํ”„๋…ธ๋“œ๋“ค์ด ํฌํ•จ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ถ€๋ชจ๋…ธ๋“œ๋กœ ๊ฐ„์ฃผํ–ˆ๋‹ค๋ฉด ์ด ๋ฌธ์ œ์—์„œ๋Š” ๋…ธ๋“œ๋“ค์„ +1, -1, 0 ์ด๋ ‡๊ฒŒ๋งŒ ์ €์žฅํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ์˜ ๋ถ€ํ˜ธ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•ˆ์˜ ์ˆซ์ž๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฆ‰ P 1 4 ๋ช…๋ น์€ tree[1] ๊ฐ’๋งŒ ์ฝ์œผ๋ฉด ๋ฐ”๋กœ ๊ทธ ๊ตฌ๊ฐ„์˜ ๊ณฑ์„ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„ == O(log N)
def sign(x):
    if x > 0: return 1
    elif x < 0: return -1
    else: return 0

# ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ๊ตฌ์ถ•
def build(arr, tree, node, start, end):
    if start == end:
        tree[node] = sign(arr[start])
    else:
        mid = (start + end) // 2
        build(arr, tree, node*2, start, mid)
        build(arr, tree, node*2+1, mid+1, end)
        tree[node] = tree[node*2] * tree[node*2+1]

# ๋‹จ์ผ ๊ฐ’ ๊ฐฑ์‹ 
def update(tree, node, start, end, idx, val):
    if start == end:
        tree[node] = sign(val)
    else:
        mid = (start + end) // 2
        if idx <= mid:
            update(tree, node*2, start, mid, idx, val)
        else:
            update(tree, node*2+1, mid+1, end, idx, val)
        tree[node] = tree[node*2] * tree[node*2+1]

# ๊ตฌ๊ฐ„ ๊ณฑ ์ฟผ๋ฆฌ
def query(tree, node, start, end, l, r):
    if r < start or end < l:   # ๊ตฌ๊ฐ„ ๋ฒ—์–ด๋‚จ
        return 1
    if l <= start and end <= r:  # ์™„์ „ํžˆ ํฌํ•จ
        return tree[node]
    mid = (start + end) // 2
    left = query(tree, node*2, start, mid, l, r)
    right = query(tree, node*2+1, mid+1, end, l, r)
    return left * right

# ๋ฉ”์ธ
N, K = map(int, input().split())
number = list(map(int, input().split()))

tree = [1] * (4*N)
build(number, tree, 1, 0, N-1)

result = []
for _ in range(K):
    order, I, V = input().split()
    I, V = int(I), int(V)

    if order == "C":
        update(tree, 1, 0, N-1, I-1, V)

    else:
        res = query(tree, 1, 0, N-1, I-1, V-1)
        if res > 0: result.append("+")
        elif res < 0: result.append("-")
        else: result.append("0")

print("".join(result))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants