본문 바로가기
백준/10001 - 15000

[백준] 12895번 : 화려한 마을

by lms0806 2025. 10. 19.

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

 

해당 문제는 느리게 갱신되는 세그먼트 트리를 활용하여 문제를 해결할 수 있습니다.

 

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

public class Main{
	static int[] lazy, tree;
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	
    	int n = Integer.parseInt(st.nextToken());
    	st.nextToken();
    	int q = Integer.parseInt(st.nextToken());
    	
    	lazy = new int[n << 2];
    	tree = new int[n << 2];
    	
    	update(1, n, 1, 1, n, 1);
    	
    	StringBuilder sb = new StringBuilder();
    	while(q --> 0) {
    		st = new StringTokenizer(br.readLine());
    		char c = st.nextToken().charAt(0);
    		int x = Integer.parseInt(st.nextToken()), y = Integer.parseInt(st.nextToken());
    		
    		if(x > y) {
    			int tmp = x;
    			x = y;
    			y = tmp;
    		}
    		
    		if(c == 'C') {
    			update(1, n, 1, x, y, 1 << (Integer.parseInt(st.nextToken()) - 1));
    		}
    		else {
    			long num = query(1, n, 1, x, y);
    			
    			int answer = 0;
    			while(num > 0) {
    				answer += (num & 1);
    				num >>= 1;
    			}
    			sb.append(answer).append("\n");
    		}
    	}
    	System.out.print(sb);    	
    }
    
    public static void propagate(int s, int e, int node) {
    	if(lazy[node] != 0) {
    		if(s != e) {
    			lazy[node << 1] = lazy[node];
    			lazy[(node << 1) + 1] = lazy[node];
    		}
    		
    		tree[node] = lazy[node];
    		lazy[node] = 0;
    	}
    }
    
    public static void update(int s, int e, int node, int l, int r, int dif) {
    	propagate(s, e, node);
    	if(e < l || r < s) {
    		return;
    	}
    	
    	if(l <= s && e <= r) {
    		lazy[node] = dif;
    		propagate(s, e, node);
    		return;
    	}
    	
    	int mid = (s + e) >> 1;
    	update(s, mid, node << 1, l, r, dif);
    	update(mid + 1, e, (node << 1) + 1, l, r, dif);
    	
    	tree[node] = tree[node << 1] | tree[(node << 1) + 1]; 
    }
    
    public static long query(int s, int e, int node, int l, int r) {
    	propagate(s, e, node);
    	if(e < l || r < s) {
    		return 0;
    	}
    	
    	if(l <= s && e <= r) {
    		return tree[node];
    	}
    	
    	int mid = (s + e) >> 1;
    	
    	return query(s, mid, node << 1, l, r) | query(mid + 1, e, (node << 1) + 1, l, r);
    }
}

'백준 > 10001 - 15000' 카테고리의 다른 글

[백준] 11920번 : 버블 정렬  (0) 2025.11.13
[백준] 10999번 : 구간 합 구하기 2  (0) 2025.09.08
[백준] 11962번 : Counting Haybales  (0) 2025.08.31
[백준] 12844번 : XOR  (0) 2025.08.23
[백준] 13308번 : 주유소  (0) 2024.12.01

댓글