Skip to content

Commit 75073a2

Browse files
authored
Create 1993-operations-on-tree.kt
1 parent 6b9ec85 commit 75073a2

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

Diff for: kotlin/1993-operations-on-tree.kt

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
class LockingTree(val parent: IntArray) {
2+
val locked = IntArray (parent.size) { -1 }
3+
val child = HashMap<Int, MutableList<Int>>()
4+
5+
init {
6+
for (i in 1 until parent.size) {
7+
child[parent[i]] = child.getOrDefault(parent[i], mutableListOf<Int>()).apply { add(i) }
8+
}
9+
}
10+
11+
fun lock(num: Int, user: Int): Boolean {
12+
if (locked[num] != -1)
13+
return false
14+
locked[num] = user
15+
return true
16+
}
17+
18+
fun unlock(num: Int, user: Int): Boolean {
19+
if (locked[num] != user)
20+
return false
21+
locked[num] = -1
22+
return true
23+
}
24+
25+
fun upgrade(num: Int, user: Int): Boolean {
26+
var i = num
27+
while (i != -1) {
28+
if (locked[i] != -1)
29+
return false
30+
i = parent[i]
31+
}
32+
33+
var lockedCount = 0
34+
var q = LinkedList<Int>()
35+
q.add(num)
36+
while (q.isNotEmpty()) {
37+
var n = q.removeLast()
38+
if (locked[n] != -1) {
39+
locked[n] = -1
40+
lockedCount++
41+
}
42+
child[n]?.forEach {
43+
q.addFirst(it)
44+
}
45+
}
46+
47+
if (lockedCount > 0)
48+
locked[num] = user
49+
50+
return lockedCount > 0
51+
}
52+
53+
}

0 commit comments

Comments
 (0)