티스토리 뷰

c언어/BAEKJOON

c언어 14245번 XOR (백준)

rofn123 2024. 8. 13. 03:07
#include <stdio.h>
int arr[500000] = {};
int tree[2000000] = {};
int lazy[2000000] = {};

int init(int s, int e, int node) {
	if(s==e) return tree[node] = arr[s];
	int m=(s+e)/2;
	return tree[node] = init(s,m,node*2)^init(m+1,e,node*2+1);
}

void lazyUpdate(int s, int e, int node) {
	if(lazy[node]) {
		if(((e-s)&1)==0) tree[node] ^= lazy[node];
		
		if(s!=e) {
			lazy[node*2] ^= lazy[node];
			lazy[node*2+1] ^= lazy[node];
		} lazy[node] = 0;
	}
}

void update(int s, int e, int node, int l, int r, int dif) {
	lazyUpdate(s,e,node);
	if(l>e || r<s) return;
	if(l<=s && e<=r) {
		if(((e-s)&1)==0) {
			tree[node] ^= dif;
			
		}
		
		if(s!=e) {
			lazy[node*2] ^= dif;
			lazy[node*2+1] ^= dif;
		}
		return;
	}
	int m=(s+e)/2;
	update(s,m,node*2,l,r,dif);
	update(m+1,e,node*2+1,l,r,dif);
	tree[node] = tree[node*2] ^ tree[node*2+1];
	return;
}

int find(int s, int e, int node, int l, int r) {
	lazyUpdate(s,e,node);
	if(l>e || r<s) return 0;
	if(l<=s && e<=r) return tree[node];
	int m=(s+e)/2;
	return find(s,m,node*2,l,r) ^ find(m+1,e,node*2+1,l,r);
} 

int main(void) {
	int n, m;
	scanf("%d",&n);
	for(int i=0; i<n; i++) scanf("%d",&arr[i]);
	init(0,n-1,1);
	scanf("%d",&m);
	while(m--) {
		int a,b,c,d;
		scanf("%d %d",&a,&b);
		if(a==1) {
			scanf("%d %d",&c, &d);
			update(0,n-1,1,b,c,d);
		}
		else if(a==2) {
			printf("%d\n",find(0,n-1,1,b,b));
		}
	}
}

 

풀이 : lazy propagation, xor

 

https://h202.tistory.com/748

 

c언어 12844번 XOR (백준)

#include int arr[500000] = {};int tree[2000000] = {};int lazy[2000000] = {};int init(int s, int e, int node) { if(s==e) return tree[node] = arr[s]; int m=(s+e)/2; return tree[node] = init(s,m,node*2)^init(m+1,e,node*2+1);}void lazyUpdate(int s, int e, int

h202.tistory.com

 

위의 문제와 같은 문제입니다.

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함