File tree 1 file changed +53
-0
lines changed
1 file changed +53
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments