Skip to content

Commit 0db8d50

Browse files
authored
feat: add swift implementation to lcp problem: No.05 (#3721)
1 parent d8b181c commit 0db8d50

File tree

2 files changed

+271
-0
lines changed

2 files changed

+271
-0
lines changed

lcp/LCP 05. 发 LeetCoin/README.md

+138
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,144 @@ public:
449449
};
450450
```
451451
452+
#### Swift
453+
454+
```swift
455+
class Node {
456+
var left: Node?
457+
var right: Node?
458+
let l: Int
459+
let r: Int
460+
let mid: Int
461+
var v = 0
462+
var add = 0
463+
464+
init(_ l: Int, _ r: Int) {
465+
self.l = l
466+
self.r = r
467+
self.mid = (l + r) >> 1
468+
}
469+
}
470+
471+
class SegmentTree {
472+
private var root: Node
473+
private let MOD = 1_000_000_007
474+
475+
init(_ n: Int) {
476+
root = Node(1, n)
477+
}
478+
479+
func modify(_ l: Int, _ r: Int, _ v: Int) {
480+
modify(l, r, v, root)
481+
}
482+
483+
private func modify(_ l: Int, _ r: Int, _ v: Int, _ node: Node) {
484+
if l > r {
485+
return
486+
}
487+
if node.l >= l && node.r <= r {
488+
node.v = (node.v + (node.r - node.l + 1) * v) % MOD
489+
node.add = (node.add + v) % MOD
490+
return
491+
}
492+
pushdown(node)
493+
if l <= node.mid {
494+
modify(l, r, v, node.left!)
495+
}
496+
if r > node.mid {
497+
modify(l, r, v, node.right!)
498+
}
499+
pushup(node)
500+
}
501+
502+
func query(_ l: Int, _ r: Int) -> Int {
503+
return query(l, r, root)
504+
}
505+
506+
private func query(_ l: Int, _ r: Int, _ node: Node) -> Int {
507+
if l > r {
508+
return 0
509+
}
510+
if node.l >= l && node.r <= r {
511+
return node.v
512+
}
513+
pushdown(node)
514+
var v = 0
515+
if l <= node.mid {
516+
v = (v + query(l, r, node.left!)) % MOD
517+
}
518+
if r > node.mid {
519+
v = (v + query(l, r, node.right!)) % MOD
520+
}
521+
return v
522+
}
523+
524+
private func pushup(_ node: Node) {
525+
node.v = (node.left!.v + node.right!.v) % MOD
526+
}
527+
528+
private func pushdown(_ node: Node) {
529+
if node.left == nil {
530+
node.left = Node(node.l, node.mid)
531+
}
532+
if node.right == nil {
533+
node.right = Node(node.mid + 1, node.r)
534+
}
535+
if node.add != 0 {
536+
let left = node.left!, right = node.right!
537+
left.v = (left.v + (left.r - left.l + 1) * node.add) % MOD
538+
right.v = (right.v + (right.r - right.l + 1) * node.add) % MOD
539+
left.add = (left.add + node.add) % MOD
540+
right.add = (right.add + node.add) % MOD
541+
node.add = 0
542+
}
543+
}
544+
}
545+
546+
class Solution {
547+
private var g: [[Int]] = []
548+
private var begin: [Int] = []
549+
private var end: [Int] = []
550+
private var idx = 1
551+
552+
func bonus(_ n: Int, _ leadership: [[Int]], _ operations: [[Int]]) -> [Int] {
553+
g = Array(repeating: [], count: n + 1)
554+
for l in leadership {
555+
let (a, b) = (l[0], l[1])
556+
g[a].append(b)
557+
}
558+
559+
begin = Array(repeating: 0, count: n + 1)
560+
end = Array(repeating: 0, count: n + 1)
561+
idx = 1
562+
dfs(1)
563+
564+
var ans: [Int] = []
565+
let tree = SegmentTree(n)
566+
for op in operations {
567+
let (p, v) = (op[0], op[1])
568+
if p == 1 {
569+
tree.modify(begin[v], begin[v], op[2])
570+
} else if p == 2 {
571+
tree.modify(begin[v], end[v], op[2])
572+
} else if p == 3 {
573+
ans.append(tree.query(begin[v], end[v]))
574+
}
575+
}
576+
return ans
577+
}
578+
579+
private func dfs(_ u: Int) {
580+
begin[u] = idx
581+
for v in g[u] {
582+
dfs(v)
583+
}
584+
end[u] = idx
585+
idx += 1
586+
}
587+
}
588+
```
589+
452590
<!-- tabs:end -->
453591

454592
<!-- solution:end -->
+133
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
class Node {
2+
var left: Node?
3+
var right: Node?
4+
let l: Int
5+
let r: Int
6+
let mid: Int
7+
var v = 0
8+
var add = 0
9+
10+
init(_ l: Int, _ r: Int) {
11+
self.l = l
12+
self.r = r
13+
self.mid = (l + r) >> 1
14+
}
15+
}
16+
17+
class SegmentTree {
18+
private var root: Node
19+
private let MOD = 1_000_000_007
20+
21+
init(_ n: Int) {
22+
root = Node(1, n)
23+
}
24+
25+
func modify(_ l: Int, _ r: Int, _ v: Int) {
26+
modify(l, r, v, root)
27+
}
28+
29+
private func modify(_ l: Int, _ r: Int, _ v: Int, _ node: Node) {
30+
if l > r {
31+
return
32+
}
33+
if node.l >= l && node.r <= r {
34+
node.v = (node.v + (node.r - node.l + 1) * v) % MOD
35+
node.add = (node.add + v) % MOD
36+
return
37+
}
38+
pushdown(node)
39+
if l <= node.mid {
40+
modify(l, r, v, node.left!)
41+
}
42+
if r > node.mid {
43+
modify(l, r, v, node.right!)
44+
}
45+
pushup(node)
46+
}
47+
48+
func query(_ l: Int, _ r: Int) -> Int {
49+
return query(l, r, root)
50+
}
51+
52+
private func query(_ l: Int, _ r: Int, _ node: Node) -> Int {
53+
if l > r {
54+
return 0
55+
}
56+
if node.l >= l && node.r <= r {
57+
return node.v
58+
}
59+
pushdown(node)
60+
var v = 0
61+
if l <= node.mid {
62+
v = (v + query(l, r, node.left!)) % MOD
63+
}
64+
if r > node.mid {
65+
v = (v + query(l, r, node.right!)) % MOD
66+
}
67+
return v
68+
}
69+
70+
private func pushup(_ node: Node) {
71+
node.v = (node.left!.v + node.right!.v) % MOD
72+
}
73+
74+
private func pushdown(_ node: Node) {
75+
if node.left == nil {
76+
node.left = Node(node.l, node.mid)
77+
}
78+
if node.right == nil {
79+
node.right = Node(node.mid + 1, node.r)
80+
}
81+
if node.add != 0 {
82+
let left = node.left!, right = node.right!
83+
left.v = (left.v + (left.r - left.l + 1) * node.add) % MOD
84+
right.v = (right.v + (right.r - right.l + 1) * node.add) % MOD
85+
left.add = (left.add + node.add) % MOD
86+
right.add = (right.add + node.add) % MOD
87+
node.add = 0
88+
}
89+
}
90+
}
91+
92+
class Solution {
93+
private var g: [[Int]] = []
94+
private var begin: [Int] = []
95+
private var end: [Int] = []
96+
private var idx = 1
97+
98+
func bonus(_ n: Int, _ leadership: [[Int]], _ operations: [[Int]]) -> [Int] {
99+
g = Array(repeating: [], count: n + 1)
100+
for l in leadership {
101+
let (a, b) = (l[0], l[1])
102+
g[a].append(b)
103+
}
104+
105+
begin = Array(repeating: 0, count: n + 1)
106+
end = Array(repeating: 0, count: n + 1)
107+
idx = 1
108+
dfs(1)
109+
110+
var ans: [Int] = []
111+
let tree = SegmentTree(n)
112+
for op in operations {
113+
let (p, v) = (op[0], op[1])
114+
if p == 1 {
115+
tree.modify(begin[v], begin[v], op[2])
116+
} else if p == 2 {
117+
tree.modify(begin[v], end[v], op[2])
118+
} else if p == 3 {
119+
ans.append(tree.query(begin[v], end[v]))
120+
}
121+
}
122+
return ans
123+
}
124+
125+
private func dfs(_ u: Int) {
126+
begin[u] = idx
127+
for v in g[u] {
128+
dfs(v)
129+
}
130+
end[u] = idx
131+
idx += 1
132+
}
133+
}

0 commit comments

Comments
 (0)