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 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)

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