Skip to content

Commit ca4d3ec

Browse files
committed
weekly contest 333
1 parent a8ced44 commit ca4d3ec

File tree

3 files changed

+305
-0
lines changed

3 files changed

+305
-0
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
66

77

88

9+
* 🐎️ [weekly contest 333](src/main/java/weekly/wk333.java)
910
* 🐎️ [weekly contest 332](src/main/java/weekly/wk332.java) 模拟 | 二分 | 哈希 | 前缀和
1011
* 🐎️ [weekly contest 331](src/main/java/weekly/wk331.java) 优先队列 | 前缀和 | 二分 | 贪心
1112
* 🐎️ [weekly contest 328](src/main/java/weekly/wk328.java) 遍历 | 二维差分数组 | 滑动窗口 | 树形DP
@@ -47,6 +48,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
4748
* 🐶 [weekly contest 290](src/main/java/weekly/wk290.java)
4849
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
4950

51+
* 🐸 [biweekly contest 98](src/main/java/weekly/wkb98.java)
5052
* 🐸 [biweekly contest 97](src/main/java/weekly/wkb97.java) 模拟 | 哈希 | 滑动窗口 | DFS
5153
* 🐸 [biweekly contest 92](src/main/java/weekly/wkb93.java) 数组 | 排序 | 贪心 | 贪心
5254
* 🐸 [biweekly contest 91](src/main/java/weekly/wkb91.java) 排序 | DP | DFS | 找规律

src/main/java/weekly/wk333.java

+129
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package weekly;
2+
3+
import javax.sound.sampled.LineUnavailableException;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.List;
7+
8+
public class wk333 {
9+
10+
//ranking: 1623 / 4969
11+
12+
//双指针,可直接treeMap
13+
public int[][] mergeArrays(int[][] nums1, int[][] nums2) {
14+
15+
int i = 0;
16+
int j = 0;
17+
List<int[]> list = new ArrayList<>();
18+
while (i < nums1.length && j < nums2.length) {
19+
if (nums1[i][0] == nums2[j][0]) {
20+
list.add(new int[]{nums1[i][0], nums1[i++][1] + nums2[j++][1]});
21+
} else if (nums1[i][0] > nums2[j][0]) {
22+
list.add(new int[]{nums2[j][0], nums2[j++][1]});
23+
} else {
24+
list.add(new int[]{nums1[i][0], nums1[i++][1]});
25+
}
26+
}
27+
while (i < nums1.length) {
28+
list.add(new int[]{nums1[i][0], nums1[i++][1]});
29+
}
30+
while (j < nums2.length) {
31+
list.add(new int[]{nums2[j][0], nums2[j++][1]});
32+
}
33+
int[][] res = new int[list.size()][2];
34+
for (int i1 = 0; i1 < list.size(); i1++) {
35+
res[i1] = list.get(i1);
36+
}
37+
return res;
38+
}
39+
40+
41+
//贪心
42+
public int minOperations(int n) {
43+
int ans = 1;
44+
while ((n & (n - 1)) > 0) { // n 不是 2 的幂次
45+
int lb = n & -n;
46+
if ((n & (lb << 1)) > 0) n += lb; // 多个连续 1
47+
else n -= lb; // 单个 1
48+
++ans;
49+
}
50+
return ans;
51+
}
52+
53+
54+
55+
/* static public int squareFreeSubsets(int[] nums) {
56+
int[] primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
57+
int[] cnt = new int[1 << primes.length];
58+
for (int num : nums) {
59+
int mask = 0;
60+
for (int i = 0; i < primes.length; i++) {
61+
if (num % primes[i] == 0) {
62+
num /= primes[i];
63+
mask ^= (1 << i);
64+
}
65+
}
66+
if (num == 1) {
67+
cnt[mask]++;
68+
}
69+
}
70+
long[] dp = new long[1 << primes.length];
71+
dp[0] = 1;
72+
for (int i = 0; i < primes.length; i++) {
73+
long[] ndp = new long[1 << primes.length];
74+
for (int j = 0; j < (1 << primes.length); j++) {
75+
ndp[j] = (dp[j] + (long) cnt[j] * dp[j ^ (1 << i)]) % MOD;
76+
}
77+
dp = ndp;
78+
}
79+
long res = 0;
80+
for (long l : dp) {
81+
res += l;
82+
}
83+
return (int) (res % MOD);
84+
}*/
85+
86+
87+
//状态压缩
88+
static private final int MOD = (int) 1e9 + 7;
89+
static public int squareFreeSubsets(int[] nums) {
90+
int[] primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
91+
int[] maskMap = new int[30 + 1];
92+
93+
for (int i = 2; i <= 30; i++) {
94+
int num = i;
95+
int mask = 0;
96+
for (int j = 0; j < primes.length; j++) {
97+
if (num % primes[j] == 0) {
98+
num /= primes[j];
99+
mask |= (1 << j);
100+
}
101+
}
102+
if (num == 1) {
103+
maskMap[i] = mask;
104+
} else {
105+
maskMap[i] = -1;
106+
}
107+
}
108+
long[] dp = new long[1 << primes.length];
109+
dp[0] = 1;
110+
for (int num : nums) {
111+
int mask = maskMap[num];
112+
if (mask < 0) continue; //存在映射
113+
for (int i = (1 << primes.length) - 1; i >= 0; i--) {
114+
if ((i | mask) == i) //mask是i的子集
115+
dp[i] = (dp[i] + dp[i ^ mask]) % MOD;
116+
}
117+
}
118+
long ans = 0;
119+
for (long l : dp) {
120+
ans += l;
121+
}
122+
return (int) ((ans - 1) % MOD); //去掉空集
123+
}
124+
125+
public static void main(String[] args) {
126+
squareFreeSubsets(new int[]{1, 1, 1});
127+
}
128+
129+
}

src/main/java/weekly/wkb98.java

+174
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.HashSet;
6+
import java.util.List;
7+
import java.util.Set;
8+
9+
public class wkb98 {
10+
//ranking: 475 / 3250
11+
12+
//最大值 将第一个不为9的替换成9
13+
//最小值 将第一个替换为0
14+
static public int minMaxDifference(int num) {
15+
String s = num + "";
16+
char big = ' ';
17+
for (int i = 0; i < s.length(); i++) {
18+
if (s.charAt(i) != '9') {
19+
big = s.charAt(i);
20+
break;
21+
}
22+
}
23+
char little = s.charAt(0);
24+
StringBuilder bigNum = new StringBuilder();
25+
StringBuilder littleNum = new StringBuilder();
26+
27+
for (int i = 0; i < s.length(); i++) {
28+
if (s.charAt(i) == big) {
29+
bigNum.append(9);
30+
} else {
31+
bigNum.append(s.charAt(i));
32+
littleNum.append(s.charAt(i));
33+
}
34+
if (s.charAt(i) == little) {
35+
littleNum.append(0);
36+
} else {
37+
littleNum.append(s.charAt(i));
38+
}
39+
}
40+
41+
System.out.println(bigNum.toString() + " " + littleNum);
42+
return Integer.parseInt(bigNum.toString()) - Integer.parseInt(littleNum.toString());
43+
44+
}
45+
46+
47+
//贪心 修改最小的两个数、最大的两个数、最大和最小的各一个数
48+
//修改的话,一定是改成和已存在的相等的数
49+
//所以min=0
50+
static public int minimizeSum(int[] nums) {
51+
Arrays.sort(nums);
52+
int a = help(Arrays.copyOfRange(nums, 2, nums.length));
53+
int b = help(Arrays.copyOfRange(nums, 0, nums.length - 2));
54+
int c = help(Arrays.copyOfRange(nums, 1, nums.length - 1));
55+
return Math.min(a, Math.min(b, c));
56+
}
57+
58+
static public int help(int[] nums) {
59+
return nums[nums.length - 1] - nums[0];
60+
}
61+
62+
63+
//只判断2的幂即可
64+
static public int minImpossibleOR(int[] nums) {
65+
Set<Integer> set = new HashSet<>();
66+
for (int num : nums) {
67+
set.add(num);
68+
}
69+
for (int i = 0; i <= 31; i++) {
70+
if (!(set.contains(1 << i))) {
71+
return 1 << i;
72+
}
73+
}
74+
return -1;
75+
}
76+
77+
78+
//懒加载线段树
79+
public long[] handleQuery(int[] nums1, int[] nums2, int[][] queries) {
80+
long sum = 0;
81+
for (int num : nums2) {
82+
sum += num;
83+
}
84+
LazySegTree tree = new LazySegTree(nums1);
85+
ArrayList<Long> list = new ArrayList<>();
86+
for (int[] query : queries) {
87+
if (query[0] == 1) {
88+
tree.updateLazySegTree(0, 0, nums1.length - 1, query[1], query[2]);
89+
} else if (query[0] == 2) {
90+
sum += query[1] * tree.queryLazySegTree(0, 0, nums1.length - 1, 0, nums1.length - 1);
91+
} else {
92+
list.add(sum);
93+
}
94+
}
95+
return list.stream().mapToLong(v -> v).toArray();
96+
}
97+
98+
class LazySegTree {
99+
private int[] tree, lazy;
100+
101+
private LazySegTree(int[] arr) {
102+
tree = new int[4 * arr.length];
103+
lazy = new int[4 * arr.length];
104+
buildSegTree(arr, 0, 0, arr.length - 1);
105+
}
106+
107+
private void buildSegTree(int[] arr, int treeIndex, int lo, int hi) {
108+
if (lo == hi) {
109+
tree[treeIndex] = arr[lo];
110+
return;
111+
}
112+
int mid = lo + (hi - lo) / 2;
113+
buildSegTree(arr, 2 * treeIndex + 1, lo, mid);
114+
buildSegTree(arr, 2 * treeIndex + 2, mid + 1, hi);
115+
tree[treeIndex] = tree[2 * treeIndex + 1] + tree[2 * treeIndex + 2];
116+
}
117+
118+
private void updateLazySegTree(int treeIndex, int lo, int hi, int i, int j) {
119+
if (lazy[treeIndex] != 0) {
120+
tree[treeIndex] = (hi - lo + 1) - tree[treeIndex];
121+
if (lo != hi) {
122+
lazy[2 * treeIndex + 1] ^= 1;
123+
lazy[2 * treeIndex + 2] ^= 1;
124+
}
125+
lazy[treeIndex] = 0;
126+
}
127+
if (lo > hi || lo > j || hi < i) {
128+
return;
129+
}
130+
if (i <= lo && hi <= j) {
131+
tree[treeIndex] = (hi - lo + 1) - tree[treeIndex];
132+
if (lo != hi) {
133+
lazy[2 * treeIndex + 1] ^= 1;
134+
lazy[2 * treeIndex + 2] ^= 1;
135+
}
136+
return;
137+
}
138+
int mid = lo + (hi - lo) / 2;
139+
updateLazySegTree(2 * treeIndex + 1, lo, mid, i, j);
140+
updateLazySegTree(2 * treeIndex + 2, mid + 1, hi, i, j);
141+
tree[treeIndex] = tree[2 * treeIndex + 1] + tree[2 * treeIndex + 2];
142+
}
143+
144+
private long queryLazySegTree(int treeIndex, int lo, int hi, int i, int j) {
145+
if (lo > j || hi < i) {
146+
return 0;
147+
}
148+
if (lazy[treeIndex] != 0) {
149+
tree[treeIndex] = (hi - lo + 1) - tree[treeIndex];
150+
if (lo != hi) {
151+
lazy[2 * treeIndex + 1] ^= 1;
152+
lazy[2 * treeIndex + 2] ^= 1;
153+
}
154+
lazy[treeIndex] = 0;
155+
}
156+
if (i <= lo && j >= hi) {
157+
return tree[treeIndex];
158+
}
159+
int mid = lo + (hi - lo) / 2;
160+
if (i > mid) {
161+
return queryLazySegTree(2 * treeIndex + 2, mid + 1, hi, i, j);
162+
} else if (j <= mid) {
163+
return queryLazySegTree(2 * treeIndex + 1, lo, mid, i, j);
164+
}
165+
long leftQuery = queryLazySegTree(2 * treeIndex + 1, lo, mid, i, mid);
166+
long rightQuery = queryLazySegTree(2 * treeIndex + 2, mid + 1, hi, mid + 1, j);
167+
return leftQuery + rightQuery;
168+
}
169+
}
170+
171+
public static void main(String[] args) {
172+
173+
}
174+
}

0 commit comments

Comments
 (0)