본문 바로가기
한국으로/알고리즘 문제풀이

[문제풀이] 1395번: 스위치

by 영킴. 2018. 7. 4.

[문제풀이] 1395번: 스위치

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


문제유형

세그먼트 트리 (Lazy Propagation)

Solution

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
#include <stdio.h>
 
int N, M;
#define MAXT (100002*2*2)
int tree[MAXT];
int lazy[MAXT];
 
void propagate(int node, int rs, int re)
{
    int m = (rs + re) / 2;
 
    if (lazy[node] == 0return;
 
    if (rs != re)
    {
        lazy[node * 2= (m - rs + 1- lazy[node * 2];
        lazy[node * 2 + 1= (re - m) - lazy[node * 2 + 1];
    }
 
    lazy[node] = 0;
    tree[node] = (re - rs + 1- tree[node];
}
 
void updateTree(int node, int s, int e, int us, int ue)
{
    int m;
 
    propagate(node, s, e);
 
    if (us > e || s > ue) return;
    if (us <= s && e <= ue)
    {
        lazy[node] = (e - s + 1- lazy[node];
        propagate(node, s, e);
        return;
    }
 
    m = (s + e) / 2;
    updateTree(node * 2, s, m, us, ue);
    updateTree(node * 2 + 1, m + 1, e, us, ue);
 
    tree[node] = tree[node * 2+ tree[node * 2 + 1];
}
 
int query(int node, int s, int e, int qs, int qe)
{
    int m, left, right;
 
    propagate(node, s, e);
 
    if (s > qe || e < qs) return 0;
    if (qs <= s && e <= qe)
    {
        return tree[node];
    }
 
    m = (s + e) / 2;
    left = query(node * 2, s, m, qs, qe);
    right = query(node * 2 + 1, m + 1, e, qs, qe);
 
    return left + right;
}
 
int main()
{
    scanf("%d %d"&N, &M);
    for (int i = 0; i < M; i++)
    {
        int O = 0, S = 0, T = 0;
        scanf("%d %d %d"&O, &S, &T);
        if (O == 0)
        {
            updateTree(11, N, S, T);
        }
        else if (O == 1)
        {
            printf("%d\n", query(11, N, S, T));
        }
    }
 
    return 0;
}
 
cs