[문제풀이] 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] == 0) return; 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(1, 1, N, S, T); } else if (O == 1) { printf("%d\n", query(1, 1, N, S, T)); } } return 0; } | cs |
'한국으로 > 알고리즘 문제풀이' 카테고리의 다른 글
[문제풀이] 1406번: 에디터 (0) | 2018.07.05 |
---|---|
[문제풀이] 2776번: 암기왕 (0) | 2018.07.04 |
[문제풀이] 1966번: 프린터 큐 (0) | 2018.07.04 |
[문제풀이] 5926번: Cow Lineup (0) | 2018.07.04 |
[문제풀이] 14706번: 구간 합 최대 (0) | 2018.07.04 |
[문제풀이] 7432번: 디스크 트리 (0) | 2018.07.04 |
[문제풀이] 5052번: 전화번호 목록 (0) | 2018.07.04 |
[문제풀이] 6593번: 상범 빌딩 (0) | 2018.07.04 |