Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 0db8d50

Browse files
feat: add swift implementation to lcp problem: No.05 (doocs#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‎

Lines changed: 138 additions & 0 deletions
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 -->
Lines changed: 133 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /