티스토리 뷰

Algorithm/BOJ

[C/C++] 백준 14245번 - XOR

poopooreum 2024. 4. 13. 10:19
반응형

✏️ 문제 링크

https://www.acmicpc.net/problem/14245

 

14245번: XOR

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

www.acmicpc.net

 

✏️ 문제 설명

 

 

✏️ 문제 풀이

느리게 갱신되는 세그먼트 트리를 이용하는 문제입니다.

백준 19975번 문제에서 XOR연산이 추가되었습니다. 느리게 갱신되는 세그먼트 트리를 구현하면서

XOR연산을 넣어주시면 됩니다. XOR기호는 ^이고, 단 갱신할려는 구간의 길이가 짝수이면 XOR연산을 해도

0이므로 구간의 길이가 홀수일 때만 XOR연산을 해주도록 설정합니다. 

 

 

✏️ 문제 코드

#include<iostream>
#include<vector>
using namespace std;
int N, M;
vector<long>arr, tree, lazy;
long initTree(int node, int start, int end);
long query(int node, int start, int end, int index);
long updateTree(int node, int start, int end, int l, int r, int value);
void lazyUpdate(int node, int start, int end);
int main() {

	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N;
	arr.resize(N+1);
	for (int i = 0; i < N; i++)
		cin >> arr[i];
	tree.resize(4 * N);
	lazy.resize(4 * N);
	initTree(1, 0, N-1 );
	cin >> M;

	int index, l, r, value;
	while (M--) {
		int Q;
		cin >> Q;
		if (Q == 1) {
			cin >> l >> r >> value;
			updateTree(1, 0, N - 1, l, r, value);
		}
		else if (Q == 2) {
			cin >> index;
			cout << query(1, 0, N - 1, index)<<"\n";
		}
	}
}

long initTree(int node, int start, int end)
{
	if (start == end)
		return tree[node] = arr[start];

	long mid = (start + end) / 2;
	long left = initTree(node * 2, start, mid);
	long right = initTree(node * 2 + 1, mid + 1, end);

	return tree[node] = left ^ right;	
}

long query(int node, int start, int end, int index)
{
	lazyUpdate(node, start, end);

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

	int mid = (start + end) / 2;

	if (index <= mid)
		return query(node * 2, start, mid, index);
	else
		return query(node * 2 + 1, mid + 1, end, index);
	
}

long updateTree(int node, int start, int end, int l, int r, int value)
{
	lazyUpdate(node, start, end);

	if (r < start || end < l)
		return tree[node];

	if (l <= start && end <= r) {
		lazy[node] = value;
		lazyUpdate(node, start, end);
		return tree[node];
	}

	int mid = (start + end) / 2;
	long left = updateTree(node * 2, start, mid, l, r, value);
	long right = updateTree(node * 2+1, mid+1, end, l, r, value);
	
	return tree[node] = left ^ right;
}

void lazyUpdate(int node, int start, int end)
{
	if (lazy[node] == 0)
		return;
	
	if ((end - start + 1) % 2 == 1)
		tree[node] ^= lazy[node];

	if (start != end) {
		lazy[node * 2] ^= lazy[node];
		lazy[node * 2+1] ^= lazy[node];
	}

	lazy[node] = 0;

}

 

 

✏️ 다른 문제 더 보기

https://pooreumjung.tistory.com/335

 

[C/C++] 백준 19975번 - 수열과 쿼리 21

✏️ 문제 링크 https://www.acmicpc.net/problem/16975 16975번: 수열과 쿼리 21 길이가 N인 수열 A1, A2, ..., AN이 주어진다. 이때, 다음 쿼리를 수행하는 프로그램을 작성하시오. 1 i j k: Ai, Ai+1, ..., Aj에 k를 더한

pooreumjung.tistory.com

https://pooreumjung.tistory.com/334

 

[C/C++] 백준 10999번 - 구간 합 구하기 2

✏️ 문제 링크 https://www.acmicpc.net/problem/10999 10999번: 구간 합 구하기 2 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이

pooreumjung.tistory.com

 

 

✏️ 세그먼트 트리 문제 보러 가기

https://pooreumjung.tistory.com/330

 

[C/C++] 백준 5676번 - 음주 코딩

✏️ 문제 링크 https://www.acmicpc.net/problem/5676 5676번: 음주 코딩 각 테스트 케이스마다 곱셈 명령의 결과를 한 줄에 모두 출력하면 된다. 출력하는 i번째 문자는 i번째 곱셈 명령의 결과이다. 양수인

pooreumjung.tistory.com

https://pooreumjung.tistory.com/328

 

[C/C++] 백준 18436번 - 수열과 쿼리 37

✏️ 문제 링크 https://www.acmicpc.net/problem/18436 18436번: 수열과 쿼리 37 길이가 N인 수열 A1, A2, ..., AN이 있다. 이때, 다음 쿼리를 수행하는 프로그램을 작성하시오. 1 i x: Ai를 x로 바꾼다. 2 l r: l ≤ i ≤

pooreumjung.tistory.com

https://pooreumjung.tistory.com/313

 

[C/C++] 백준 - 수열과 쿼리 문제

✏️ 문제 링크 https://www.acmicpc.net/problem/14438 14438번: 수열과 쿼리 17 길이가 N인 수열 A1, A2, ..., AN이 주어진다. 이때, 다음 쿼리를 수행하는 프로그램을 작성하시오. 1 i v : Ai를 v로 바꾼다. (1 ≤ i

pooreumjung.tistory.com

https://pooreumjung.tistory.com/312

 

[C/C++] 백준 - 세그먼트 트리 문제

✏️ 세그먼트 트리 기본 개념 https://pooreumjung.tistory.com/305 Algorithm 공부 #21 - 세그먼트 트리 Algorithm 공부 #21 - 세그먼트 트리 세그먼트 트리(Segmant Tree) ● 주어진 제이터의 구간 합과 데이트 업데

pooreumjung.tistory.com

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함