Skip to content

Commit 5cc85c5

Browse files
committed
Updated tags
1 parent ed7c7af commit 5cc85c5

File tree

4 files changed

+137
-117
lines changed
  • src/main/kotlin/g3501_3600

4 files changed

+137
-117
lines changed
Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,39 @@
11
package g3501_3600.s3582_generate_tag_for_video_caption
22

3-
// #Easy #2025_06_16_Time_40_ms_(100.00%)_Space_46.98_MB_(55.56%)
4-
5-
import java.util.Locale
3+
// #Easy #String #Simulation #2025_06_17_Time_3_ms_(100.00%)_Space_45.13_MB_(85.00%)
64

75
class Solution {
86
fun generateTag(caption: String): String? {
9-
if (caption.trim { it <= ' ' }.isEmpty()) {
10-
return "#"
11-
}
12-
val arr = caption.trim { it <= ' ' }.split("\\s+".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
13-
val res = StringBuilder("#")
14-
var firstWord = arr[0]
15-
firstWord =
16-
(
17-
firstWord.substring(0, 1).lowercase(Locale.getDefault()) +
18-
(if (firstWord.length > 1) firstWord.substring(1).lowercase(Locale.getDefault()) else "")
19-
)
20-
res.append(firstWord)
21-
for (i in 1..<arr.size) {
22-
var w = arr[i]
23-
if (w.isEmpty()) {
24-
continue
7+
var caption = caption
8+
val sb = StringBuilder()
9+
sb.append('#')
10+
var space = false
11+
caption = caption.trim { it <= ' ' }
12+
for (i in 0..<caption.length) {
13+
val c = caption[i]
14+
if (c == ' ') {
15+
space = true
2516
}
26-
w =
27-
(
28-
w.substring(0, 1).uppercase(Locale.getDefault()) +
29-
(if (w.length > 1) w.substring(1).lowercase(Locale.getDefault()) else "")
30-
)
31-
res.append(w)
32-
if (res.length >= 100) {
33-
break
17+
if (c >= 'A' && c <= 'Z') {
18+
if (space) {
19+
space = !space
20+
sb.append(c)
21+
} else {
22+
sb.append(c.lowercaseChar())
23+
}
3424
}
25+
if (c >= 'a' && c <= 'z') {
26+
if (space) {
27+
space = !space
28+
sb.append(c.uppercaseChar())
29+
} else {
30+
sb.append(c)
31+
}
32+
}
33+
}
34+
if (sb.length > 100) {
35+
return sb.substring(0, 100)
3536
}
36-
return if (res.length > 100) res.substring(0, 100) else res.toString()
37+
return sb.toString()
3738
}
3839
}

src/main/kotlin/g3501_3600/s3583_count_special_triplets/Solution.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package g3501_3600.s3583_count_special_triplets
22

3-
// #Medium #2025_06_16_Time_263_ms_(100.00%)_Space_99.88_MB_(42.86%)
3+
// #Medium #Array #Hash_Table #Counting #2025_06_17_Time_238_ms_(55.56%)_Space_83.48_MB_(77.78%)
44

55
class Solution {
66
fun specialTriplets(nums: IntArray): Int {

src/main/kotlin/g3501_3600/s3584_maximum_product_of_first_and_last_elements_of_a_subsequence/Solution.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package g3501_3600.s3584_maximum_product_of_first_and_last_elements_of_a_subsequence
22

3-
// #Medium #2025_06_16_Time_8_ms_(100.00%)_Space_72.69_MB_(100.00%)
3+
// #Medium #Array #Two_Pointers #2025_06_17_Time_8_ms_(100.00%)_Space_80.95_MB_(50.00%)
44

55
import kotlin.math.max
66
import kotlin.math.min
Lines changed: 106 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,122 +1,141 @@
11
package g3501_3600.s3585_find_weighted_median_node_in_tree
22

3-
// #Hard #2025_06_16_Time_169_ms_(100.00%)_Space_171.76_MB_(100.00%)
3+
// #Hard #Array #Dynamic_Programming #Tree #Binary_Search #Depth_First_Search
4+
// #2025_06_17_Time_123_ms_(100.00%)_Space_184.68_MB_(100.00%)
5+
6+
import kotlin.math.ceil
7+
import kotlin.math.ln
48

59
class Solution {
6-
private var log = 0
7-
private lateinit var dist: LongArray
10+
private lateinit var adj: MutableList<MutableList<IntArray>>
811
private lateinit var depth: IntArray
9-
private lateinit var up: Array<IntArray>
12+
private lateinit var dist: LongArray
13+
private lateinit var parent: Array<IntArray>
14+
private var longMax = 0
15+
private var nodes = 0
1016

1117
fun findMedian(n: Int, edges: Array<IntArray>, queries: Array<IntArray>): IntArray {
12-
val adj: MutableList<MutableList<IntArray>?> = ArrayList<MutableList<IntArray>?>()
18+
nodes = n
19+
if (n > 1) {
20+
longMax = ceil(ln(n.toDouble()) / ln(2.0)).toInt()
21+
} else {
22+
longMax = 1
23+
}
24+
adj = ArrayList<MutableList<IntArray>>()
1325
for (i in 0..<n) {
1426
adj.add(ArrayList<IntArray>())
1527
}
1628
for (edge in edges) {
17-
adj[edge[0]]!!.add(intArrayOf(edge[1], edge[2]))
18-
adj[edge[1]]!!.add(intArrayOf(edge[0], edge[2]))
29+
val u = edge[0]
30+
val v = edge[1]
31+
val w = edge[2]
32+
adj[u].add(intArrayOf(v, w))
33+
adj[v].add(intArrayOf(u, w))
1934
}
20-
dist = LongArray(n)
2135
depth = IntArray(n)
22-
log = 0
23-
while (1 shl log < n) {
24-
log++
25-
}
26-
up = Array(n) { IntArray(log) }
27-
for (u in up) {
28-
u.fill(-1)
36+
dist = LongArray(n)
37+
parent = Array<IntArray>(longMax) { IntArray(n) }
38+
for (i in 0..<longMax) {
39+
parent[i].fill(-1)
2940
}
30-
dfs(0, -1, adj, 0, 0)
41+
dfs(0, -1, 0, 0L)
42+
buildLcaTable()
3143
val ans = IntArray(queries.size)
32-
for (i in queries.indices) {
33-
val query = queries[i]
34-
var first = query[0]
35-
var second = query[1]
36-
val distance = getDistance(first, second)
37-
var needed = (distance + 1) / 2
38-
val mid = lca(first, second)
39-
if (getDistance(first, mid) < needed) {
40-
needed -= getDistance(first, mid)
41-
first = mid
42-
} else {
43-
second = mid
44-
}
45-
if (depth[first] <= depth[second]) {
46-
var curDistance = getDistance(first, second)
47-
for (j in log - 1 downTo 0) {
48-
if (up[second][j] == -1 ||
49-
curDistance - getDistance(up[second][j], second) < needed
50-
) {
51-
continue
52-
}
53-
curDistance -= getDistance(up[second][j], second)
54-
second = up[second][j]
55-
}
56-
ans[i] = second
57-
} else {
58-
var curDistance: Long = 0
59-
for (j in log - 1 downTo 0) {
60-
if (up[first][j] == -1 ||
61-
curDistance + getDistance(up[first][j], first) >= needed
62-
) {
63-
continue
64-
}
65-
curDistance += getDistance(up[first][j], first)
66-
first = up[first][j]
67-
}
68-
ans[i] = up[first][0]
69-
}
44+
var sabrelonta: IntArray
45+
for (qIdx in queries.indices) {
46+
sabrelonta = queries[qIdx]
47+
val u = sabrelonta[0]
48+
val v = sabrelonta[1]
49+
ans[qIdx] = findMedianNode(u, v)
7050
}
51+
7152
return ans
7253
}
7354

74-
private fun getDistance(from: Int, to: Int): Long {
75-
if (from == to) {
76-
return 0
55+
private fun dfs(u: Int, p: Int, d: Int, currentDist: Long) {
56+
depth[u] = d
57+
parent[0][u] = p
58+
dist[u] = currentDist
59+
for (edge in adj[u]) {
60+
val v = edge[0]
61+
val w = edge[1]
62+
if (v == p) {
63+
continue
64+
}
65+
dfs(v, u, d + 1, currentDist + w)
7766
}
78-
val ancesor = lca(from, to)
79-
return dist[from] + dist[to] - 2 * dist[ancesor]
8067
}
8168

82-
private fun lca(first: Int, second: Int): Int {
83-
var first = first
84-
var second = second
85-
if (depth[first] < depth[second]) {
86-
return lca(second, first)
69+
private fun buildLcaTable() {
70+
for (k in 1..<longMax) {
71+
for (node in 0..<nodes) {
72+
if (parent[k - 1][node] != -1) {
73+
parent[k][node] = parent[k - 1][parent[k - 1][node]]
74+
}
75+
}
8776
}
88-
for (i in log - 1 downTo 0) {
89-
if (depth[first] - (1 shl i) >= depth[second]) {
90-
first = up[first][i]
77+
}
78+
79+
private fun getKthAncestor(u: Int, k: Int): Int {
80+
var u = u
81+
for (p in longMax - 1 downTo 0) {
82+
if (u == -1) {
83+
break
84+
}
85+
if (((k shr p) and 1) == 1) {
86+
u = parent[p][u]
9187
}
9288
}
93-
if (first == second) {
94-
return second
89+
return u
90+
}
91+
92+
private fun getLCA(u: Int, v: Int): Int {
93+
var u = u
94+
var v = v
95+
if (depth[u] < depth[v]) {
96+
val temp = u
97+
u = v
98+
v = temp
9599
}
96-
for (i in log - 1 downTo 0) {
97-
if (depth[first] != -1 && up[first][i] != up[second][i]) {
98-
first = up[first][i]
99-
second = up[second][i]
100+
u = getKthAncestor(u, depth[u] - depth[v])
101+
if (u == v) {
102+
return u
103+
}
104+
for (p in longMax - 1 downTo 0) {
105+
if (parent[p][u] != -1 && parent[p][u] != parent[p][v]) {
106+
u = parent[p][u]
107+
v = parent[p][v]
100108
}
101109
}
102-
first = up[first][0]
103-
return first
110+
return parent[0][u]
104111
}
105112

106-
private fun dfs(current: Int, parent: Int, adj: MutableList<MutableList<IntArray>?>, curDist: Long, curDepth: Int) {
107-
up[current][0] = parent
108-
for (i in 1..<log) {
109-
if (up[current][i - 1] != -1) {
110-
up[current][i] = up[up[current][i - 1]][i - 1]
111-
}
113+
private fun findMedianNode(u: Int, v: Int): Int {
114+
if (u == v) {
115+
return u
112116
}
113-
dist[current] = curDist
114-
depth[current] = curDepth
115-
for (next in adj[current]!!) {
116-
if (next[0] == parent) {
117-
continue
117+
val lca = getLCA(u, v)
118+
val totalPathWeight = dist[u] + dist[v] - 2 * dist[lca]
119+
val halfWeight = (totalPathWeight + 1) / 2L
120+
if (dist[u] - dist[lca] >= halfWeight) {
121+
var curr = u
122+
for (p in longMax - 1 downTo 0) {
123+
val nextNode = parent[p][curr]
124+
if (nextNode != -1 && (dist[u] - dist[nextNode] < halfWeight)) {
125+
curr = nextNode
126+
}
127+
}
128+
return parent[0][curr]
129+
} else {
130+
val remainingWeightFromLCA = halfWeight - (dist[u] - dist[lca])
131+
var curr = v
132+
for (p in longMax - 1 downTo 0) {
133+
val nextNode = parent[p][curr]
134+
if (nextNode != -1 && depth[nextNode] >= depth[lca] && (dist[nextNode] - dist[lca]) >= remainingWeightFromLCA) {
135+
curr = nextNode
136+
}
118137
}
119-
dfs(next[0], current, adj, curDist + next[1], curDepth + 1)
138+
return curr
120139
}
121140
}
122141
}

0 commit comments

Comments
 (0)