deno.land / x / masx200_leetcode_test@10.6.5 / range-module / index.ts

نووسراو ببینە
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
88
89
90
91
92
93
94
95
96
97
98
99
import { searchSegmentLeaf } from "../mod.ts";import { SegmentTree } from "../my-calendar-iii/SegmentTree.ts";
export default class RangeModule { #isRangeTracked(left: number, right: number, node: SegmentTree): boolean { if (left > right || left > node.end || right < node.start) { return false; } if (node.children.length) { const can_cache_result = left <= node.start && right >= node.end; if (can_cache_result) { const isRangeTrackedCached = node.value; if (isRangeTrackedCached >= 0) { return isRangeTrackedCached > 0; } } const isRangeTracked_result = node.children .filter((node) => { if (left > right || left > node.end || right < node.start) { return false; } return true; }) .every((child) => this.#isRangeTracked(left, right, child)); return isRangeTracked_result; } else { return node.value > 0; } } #root: SegmentTree = SegmentTree( Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, );
addRange(left: number, right: number): void { const parents: SegmentTree[] = []; const nodes = searchSegmentLeaf(left, right - 1, this.#root, { each: (node) => { if (node.children.length) { parents.push(node); } }, }); for (const node of nodes) { node.value = 1; } this.#update_parents(parents); for (const node of parents) { if (node.value > 0) { node.children.length = 0; } } this.#merge_children(parents); }
queryRange(left: number, right: number): boolean { return this.#isRangeTracked(left, right - 1, this.#root); } #update_parents(nodes: SegmentTree[]) { for (let i = nodes.length - 1; i >= 0; i--) { const node = nodes[i]; node.value = node.children.every((child) => child.value > 0) ? 1 : 0; } } #merge_children(nodes: SegmentTree[]) { for (let i = nodes.length - 1; i >= 0; i--) { const node = nodes[i]; if (node.children.every((child) => child.value > 0)) { node.children.length = 0; } if ( node.children.every( (child) => child.children.length === 0 && child.value === 0, ) ) { node.children.length = 0; } } } removeRange(left: number, right: number): void { const parents: SegmentTree[] = []; const nodes = searchSegmentLeaf(left, right - 1, this.#root, { each: (node) => { if (node.children.length) { parents.push(node); } }, }); for (const node of nodes) { node.value = 0; } this.#update_parents(parents); this.#merge_children(parents); }}
masx200_leetcode_test

Version Info

Tagged at
a year ago