알고리즘 문제/[백준]

[백준] 14245 XOR

latter2005 2021. 2. 22. 21:51
 

14245번: XOR

첫 번째 줄에 수열의 크기 n (0 < n ≤ 500,000)이 주어진다. 두 번째 줄에 수열의 원소가 0번부터 n - 1번까지 차례대로 주어진다. 수열의 원소는 100,000보다 크지 않은 음이 아닌 정수이다. 세 번째 줄

www.acmicpc.net

문제 확인

 

구간 업데이트 처리 문제입니다.

세그먼트 트리를 활용해서 풀 수 있지만 점 쿼리 처리에 특화된 펜윅트리를 사용하여 더욱 빠르게 풀 수 있습니다.

 

펜윅 트리(Fenwick Tree, Binary Indexed Tree, BIT)

펜윅 트리(Fenwick Tree, Binary Indexed Tree, BIT)란? 이전 게시물에서는 세그먼트 트리에 대해 게시물을 올렸다. (세그먼트 트리 :: http://www.crocus.co.kr/648) 이 펜윅 트리를 이해하기 위해서는 세그먼트..

www.crocus.co.kr

 

풀이

 

펜윅트리를 적용하면 간단하게 풀 수 있는 문제입니다.

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <vector>
#include <algorithm>
typedef long long ll;
using namespace std;
int n, m;
int ary[500001];
 
inline void update(int i, int val) {
    for (; i <= n; i += i & -i)
        ary[i] ^= val;
}
inline int query(int i) {
    int t = 0;
    for (; i; i -= i & -i)
        t ^= ary[i];
    return t;
}
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
 
    cin >> n;
    for (int i = 0, t; i < n; i++) {
        cin >> t;
        update(i + 1, t);
        update(i + 2, t);
    }
 
 
    cin >> m;
    while (m--) {
        int op;
        cin >> op;
        if (op != 2) {
            int s, e, v;
            cin >> s >> e >> v;
            update(s + 1, v);
            update(e + 2, v);
        }
        else {
            int i;
            cin >> i;
            cout << query(i + 1<< '\n';
        }
    }
}
cs
반응형

'알고리즘 문제 > [백준]' 카테고리의 다른 글

[백준] 1786 찾기  (0) 2021.03.02
[백준] 1298 노트북의 주인을 찾아서  (0) 2021.02.22
[백준] 1915 가장 큰 정사각형  (0) 2021.02.22
[백준] 1126 같은 탑  (0) 2021.02.20
[백준] 20541 앨범정리  (0) 2021.02.20