Skip to content

Commit 4b81f52

Browse files
committed
第468场周赛T1~T4 (4)
1 parent 586a2e3 commit 4b81f52

File tree

8 files changed

+300
-0
lines changed

8 files changed

+300
-0
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
public class Solution3688 {
2+
public int evenNumberBitwiseORs(int[] nums) {
3+
int ans = 0;
4+
for (int v : nums) {
5+
if (v % 2 == 0) {
6+
ans |= v;
7+
}
8+
}
9+
return ans;
10+
}
11+
}
12+
/*
13+
3688. 偶数的按位或运算
14+
https://leetcode.cn/problems/bitwise-or-of-even-numbers-in-an-array/description/
15+
16+
第 468 场周赛 T1。
17+
18+
给你一个整数数组 nums。
19+
返回数组中所有 偶数 的按位 或 运算结果。
20+
如果 nums 中没有偶数,返回 0。
21+
提示:
22+
1 <= nums.length <= 100
23+
1 <= nums[i] <= 100
24+
25+
中国时间 2025-09-21 周日 10:30
26+
佛山。
27+
模拟。
28+
*/
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import java.util.Arrays;
2+
3+
public class Solution3689 {
4+
public long maxTotalValue(int[] nums, int k) {
5+
int mx = Arrays.stream(nums).max().orElseThrow();
6+
int mn = Arrays.stream(nums).min().orElseThrow();
7+
return (long) (mx - mn) * k;
8+
}
9+
}
10+
/*
11+
3689. 最大子数组总值 I
12+
https://leetcode.cn/problems/maximum-total-subarray-value-i/description/
13+
14+
第 468 场周赛 T2。
15+
16+
给定一个长度为 n 的整数数组 nums 和一个整数 k。
17+
你必须从 nums 中选择 恰好 k 个非空子数组 nums[l..r]。子数组可以重叠,同一个子数组(相同的 l 和 r)可以 被选择超过一次。
18+
子数组 nums[l..r] 的 值 定义为:max(nums[l..r]) - min(nums[l..r])。
19+
总值 是所有被选子数组的 值 之和。
20+
返回你能实现的 最大 可能总值。
21+
子数组 是数组中连续的 非空 元素序列。
22+
提示:
23+
1 <= n == nums.length <= 5 * 10^4
24+
0 <= nums[i] <= 10^9
25+
1 <= k <= 10^5
26+
27+
脑筋急转弯。最大值 - 最小值 的值乘以 k 即可。
28+
*/
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import java.util.*;
2+
import java.util.stream.Collectors;
3+
4+
public class Solution3690 {
5+
public int minSplitMerge(int[] nums1, int[] nums2) {
6+
int n = nums1.length;
7+
List<Integer> nums2List = toList(nums2);
8+
Set<List<Integer>> vis = new HashSet<>();
9+
vis.add(toList(nums1));
10+
List<List<Integer>> q = List.of(toList(nums1));
11+
for (int ans = 0; ; ans++) {
12+
List<List<Integer>> tmp = q;
13+
q = new ArrayList<>();
14+
for (List<Integer> a : tmp) {
15+
if (a.equals(nums2List)) {
16+
return ans;
17+
}
18+
for (int l = 0; l < n; l++) {
19+
for (int r = l + 1; r <= n; r++) {
20+
List<Integer> sub = a.subList(l, r);
21+
List<Integer> b = new ArrayList<>(a);
22+
b.subList(l, r).clear(); // 从 b 中移除 sub
23+
for (int i = 0; i <= b.size(); i++) {
24+
List<Integer> c = new ArrayList<>(b);
25+
c.addAll(i, sub);
26+
if (vis.add(c)) { // c 不在 vis 中
27+
q.add(c);
28+
}
29+
}
30+
}
31+
}
32+
}
33+
}
34+
}
35+
36+
private List<Integer> toList(int[] nums) {
37+
return Arrays.stream(nums).boxed().collect(Collectors.toList());
38+
}
39+
}
40+
/*
41+
3690. 拆分合并数组
42+
https://leetcode.cn/problems/split-and-merge-array-transformation/description/
43+
44+
第 468 场周赛 T3。
45+
46+
给你两个长度为 n 的整数数组 nums1 和 nums2。你可以对 nums1 执行任意次下述的 拆分合并操作:
47+
1.选择一个子数组 nums1[L..R]。
48+
2.移除该子数组,留下前缀 nums1[0..L-1](如果 L = 0 则为空)和后缀 nums1[R+1..n-1](如果 R = n - 1 则为空)。
49+
3.将移除的子数组(按原顺序)重新插入到剩余数组的 任意 位置(即,在任意两个元素之间、最开始或最后面)。
50+
返回将 nums1 转换为 nums2 所需的 最少拆分合并操作 次数。
51+
提示:
52+
2 <= n == nums1.length == nums2.length <= 6
53+
-10^5 <= nums1[i], nums2[i] <= 10^5
54+
nums2 是 nums1 的一个 排列。
55+
56+
根据数据范围,至多有 6!=720 个不同的排列,这很小,考虑暴力。
57+
https://leetcode.cn/problems/split-and-merge-array-transformation/solutions/3787914/bfspythonjavacgo-by-endlesscheng-86ya/
58+
时间复杂度 O(n! * n^4)。
59+
*/
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import java.util.Comparator;
2+
import java.util.PriorityQueue;
3+
4+
public class Solution3691 {
5+
public long maxTotalValue(int[] nums, int k) {
6+
int n = nums.length;
7+
SparseTable st = new SparseTable(nums);
8+
9+
PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(o -> -o[0])); // 最大堆
10+
for (int i = 0; i < n; i++) {
11+
pq.add(new int[]{st.query(i, n - 1), i, n - 1}); // 子数组值,左端点,右端点加一
12+
}
13+
14+
long ans = 0;
15+
while (k-- > 0 && pq.peek()[0] > 0) {
16+
int[] top = pq.poll();
17+
ans += top[0];
18+
top[2]--;
19+
top[0] = st.query(top[1], top[2]);
20+
pq.add(top);
21+
}
22+
return ans;
23+
}
24+
25+
static class SparseTable {
26+
long[][] mx, mi;
27+
int[] logTable;
28+
29+
public SparseTable(int[] arr) {
30+
int n = arr.length;
31+
int maxLog = log2(n) + 1;
32+
mx = new long[n][maxLog];
33+
mi = new long[n][maxLog];
34+
logTable = new int[n + 1];
35+
// 预处理对数表
36+
for (int i = 2; i <= n; ++i) {
37+
logTable[i] = logTable[i / 2] + 1;
38+
}
39+
// 初始化 ST 表
40+
for (int i = 0; i < n; ++i) {
41+
mx[i][0] = arr[i];
42+
mi[i][0] = arr[i];
43+
}
44+
// 动态规划填充表
45+
for (int j = 1; (1 << j) <= n; ++j) {
46+
for (int i = 0; i + (1 << j) <= n; ++i) {
47+
mx[i][j] = Math.max(mx[i][j - 1], mx[i + (1 << (j - 1))][j - 1]);
48+
mi[i][j] = Math.min(mi[i][j - 1], mi[i + (1 << (j - 1))][j - 1]);
49+
}
50+
}
51+
}
52+
53+
// ceil(log2(x)) = 32 - numberOfLeadingZeros(x - 1)
54+
int log2(long x) {
55+
return 64 - Long.numberOfLeadingZeros(x - 1);
56+
}
57+
58+
long query_max(int l, int r) {
59+
int j = logTable[r - l + 1];
60+
return Math.max(mx[l][j], mx[r - (1 << j) + 1][j]);
61+
}
62+
63+
long query_min(int l, int r) {
64+
int j = logTable[r - l + 1];
65+
return Math.min(mi[l][j], mi[r - (1 << j) + 1][j]);
66+
}
67+
68+
int query(int l, int r) {
69+
return (int) (query_max(l, r) - query_min(l, r));
70+
}
71+
}
72+
}
73+
/*
74+
3691. 最大子数组总值 II
75+
https://leetcode.cn/problems/maximum-total-subarray-value-ii/description/
76+
77+
第 468 场周赛 T4。
78+
79+
给你一个长度为 n 的整数数组 nums 和一个整数 k。
80+
你必须从 nums 中选择 恰好 k 个 不同 的非空子数组 nums[l..r]。子数组可以重叠,但同一个子数组(相同的 l 和 r)不能 被选择超过一次。
81+
子数组 nums[l..r] 的 值 定义为:max(nums[l..r]) - min(nums[l..r])。
82+
总值 是所有被选子数组的 值 之和。
83+
返回你能实现的 最大 可能总值。
84+
子数组 是数组中连续的 非空 元素序列。
85+
提示:
86+
1 <= n == nums.length <= 5 * 10^4
87+
0 <= nums[i] <= 10^9
88+
1 <= k <= min(10^5, n * (n + 1) / 2)
89+
90+
ST 表 + 最大堆
91+
https://leetcode.cn/problems/maximum-total-subarray-value-ii/solutions/3787892/st-biao-zui-da-dui-pythonjavacgo-by-endl-igja/
92+
*/
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import org.junit.jupiter.api.Assertions;
2+
import org.junit.jupiter.api.Test;
3+
4+
public class Solution3688Tests {
5+
private final Solution3688 solution3688 = new Solution3688();
6+
7+
@Test
8+
public void example1() {
9+
int[] nums = {1, 2, 3, 4, 5, 6};
10+
int expected = 6;
11+
Assertions.assertEquals(expected, solution3688.evenNumberBitwiseORs(nums));
12+
}
13+
14+
@Test
15+
public void example2() {
16+
int[] nums = {7, 9, 11};
17+
int expected = 0;
18+
Assertions.assertEquals(expected, solution3688.evenNumberBitwiseORs(nums));
19+
}
20+
21+
@Test
22+
public void example3() {
23+
int[] nums = {1, 8, 16};
24+
int expected = 24;
25+
Assertions.assertEquals(expected, solution3688.evenNumberBitwiseORs(nums));
26+
}
27+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import org.junit.jupiter.api.Assertions;
2+
import org.junit.jupiter.api.Test;
3+
4+
public class Solution3689Tests {
5+
private final Solution3689 solution3689 = new Solution3689();
6+
7+
@Test
8+
public void example1() {
9+
int[] nums = {1, 3, 2};
10+
int k = 2;
11+
long expected = 4;
12+
Assertions.assertEquals(expected, solution3689.maxTotalValue(nums, k));
13+
}
14+
15+
@Test
16+
public void example2() {
17+
int[] nums = {4, 2, 5, 1};
18+
int k = 3;
19+
long expected = 12;
20+
Assertions.assertEquals(expected, solution3689.maxTotalValue(nums, k));
21+
}
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import org.junit.jupiter.api.Assertions;
2+
import org.junit.jupiter.api.Test;
3+
4+
public class Solution3690Tests {
5+
private final Solution3690 solution3690 = new Solution3690();
6+
7+
@Test
8+
public void example1() {
9+
int[] nums1 = {3, 1, 2};
10+
int[] nums2 = {1, 2, 3};
11+
int expected = 1;
12+
Assertions.assertEquals(expected, solution3690.minSplitMerge(nums1, nums2));
13+
}
14+
15+
@Test
16+
public void example2() {
17+
int[] nums1 = {1, 1, 2, 3, 4, 5};
18+
int[] nums2 = {5, 4, 3, 2, 1, 1};
19+
int expected = 3;
20+
Assertions.assertEquals(expected, solution3690.minSplitMerge(nums1, nums2));
21+
}
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import org.junit.jupiter.api.Assertions;
2+
import org.junit.jupiter.api.Test;
3+
4+
public class Solution3691Tests {
5+
private final Solution3691 solution3691 = new Solution3691();
6+
7+
@Test
8+
public void example1() {
9+
int[] nums = {1, 3, 2};
10+
int k = 2;
11+
long expected = 4;
12+
Assertions.assertEquals(expected, solution3691.maxTotalValue(nums, k));
13+
}
14+
15+
@Test
16+
public void example2() {
17+
int[] nums = {4, 2, 5, 1};
18+
int k = 3;
19+
long expected = 12;
20+
Assertions.assertEquals(expected, solution3691.maxTotalValue(nums, k));
21+
}
22+
}

0 commit comments

Comments
 (0)