본문 바로가기

ProgramSoliving

백준 : 1395 (JAVA)

반응형

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

 

1395번: 스위치

문제 준규네 집에는 총 N개의 스위치가 있고 이를 편하게 1번부터 N번까지 차례대로 번호를 매겼다. 그리고 준규의 취미는 이 스위치들을 켜고 끄는 것이다. 준규가 하는 스위치를 갖고 노는 일은 크게 두 가지이다. 하나는 A번부터 B번 사이의 스위치 상태를 반전시키는 것이고 다른 하나는 C번부터 D번 사이의 스위치 중 켜져 있는 상태의 스위치의 개수를 세는 것이다. 하지만 준규가 싫증을 느껴 우리가 이 귀찮은 일을 떠맡게 되었고 프로그래밍을 통해 일을 처리

www.acmicpc.net

늦은 전파 세그먼트트리 문제.

세그먼트트리를 구현하고 새로운값 갱신시에는 늦은전파를 활용한다.

문제에서 스위치 이기때문에 laze[n]  홀수면은 end-start+1 이 그구간의 최대 전구이므로 현재 tree[n]에서 빼준다. 짝수이면 두번누르는것이므로 아무일도 하지않고 종료한다.
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package D0227;
 
 
public class B1395 {
    static int Tree[];
    static int laze[];
    static int N, M;
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        Tree = new int[N * 4];
        laze = new int[N * 4];
        for (int m = 0; m < M; m++) {
            st = new StringTokenizer(br.readLine());
            int o = Integer.parseInt(st.nextToken());
            int s = Integer.parseInt(st.nextToken());
            int t = Integer.parseInt(st.nextToken());
 
            if (o == 0) {
                // 반전
                update(1, N, s, t, 1);
            } else {
                // sum
                System.out.println(sum(1, N, s, t, 1));
            }
        }
    }
 
    public static int sum(int start, int end, int s, int t, int n) {
        lazeUpdate(start, end, n);
        if (t < start || end < s) {
            return 0;
        }
 
        if (s <= start && end <= t) {
            return Tree[n];
        }
 
        int mid = (start + end) / 2;
 
        return sum(start, mid, s, t, n * 2+ sum(mid + 1, end, s, t, n * 2 + 1);
 
    }
 
    public static void update(int start, int end, int s, int t, int n) {
        lazeUpdate(start, end, n);
        if (t < start || end < s)
            return;
 
        if (s <= start && end <= t) {
            // update
            laze[n] += 1;
            lazeUpdate(start, end, n);
            return;
        }
 
        int mid = (start + end) / 2;
        update(start, mid, s, t, n * 2);
        update(mid + 1, end, s, t, n * 2 + 1);
        Tree[n] = Tree[n * 2+ Tree[n * 2 + 1];
 
    }
 
    public static void lazeUpdate(int start, int end, int n) {
        if (laze[n] == 0)
            return;
        if (laze[n] % 2 == 1) {
            Tree[n] = (end-start + 1- Tree[n];
        }
 
        if (start != end) {
            laze[n * 2+= laze[n];
            laze[n * 2 + 1+= laze[n];
        }
        laze[n] = 0;
 
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 1726  (0) 2020.02.29
백준 : 12844  (0) 2020.02.28
백준 : 109999 (JAVA)  (0) 2020.02.27
백준 : 2042 ( 세그먼트 트리)  (0) 2020.02.27
백준 : 1517  (0) 2020.02.26