Skip to content

Commit 0ae4c47

Browse files
committed
weekly contest 364
1 parent 919b76a commit 0ae4c47

File tree

2 files changed

+171
-1
lines changed

2 files changed

+171
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Record leetcode contest and ideas every week, and encourage yourself to think mo
44

55
leetcode url: <https://leetcode.cn/u/cctest/>
66

7-
7+
* 🐼 [weekly contest 364](src/main/java/weekly/wk364.java) 贪心 | 单调栈 | 单调栈 | dfs
88
* 🐼 [weekly contest 363](src/main/java/weekly/wk363.java) 暴力 | 遍历 | 二分 | 质数分解
99
* 🐼 [weekly contest 362](src/main/java/weekly/wk362.java) 差分数组 | 贪心 | 全排列 |
1010
* 🐼 [weekly contest 361](src/main/java/weekly/wk361.java) 枚举 | 枚举 | 前缀和 | 树上倍增+LCA

src/main/java/weekly/wk364.java

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
package weekly;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.Collections;
7+
import java.util.HashMap;
8+
import java.util.HashSet;
9+
import java.util.List;
10+
import java.util.Map;
11+
import java.util.Set;
12+
import java.util.TreeMap;
13+
14+
public class wk364 {
15+
16+
//贪心
17+
public String maximumOddBinaryNumber(String s) {
18+
int count = 0;
19+
for (int i = 0; i < s.length(); i++) {
20+
if (s.charAt(i) == '1') {
21+
count++;
22+
}
23+
}
24+
char[] ans = new char[s.length()];
25+
26+
count--;
27+
for (int i = 0; i < ans.length; i++) {
28+
if (count > 0) {
29+
count--;
30+
ans[i] = '1';
31+
} else {
32+
ans[i] = '0';
33+
}
34+
}
35+
ans[ans.length - 1] = '1';
36+
return new String(ans);
37+
}
38+
39+
40+
/* public long maximumSumOfHeights(List<Integer> maxHeights) {
41+
long res = 0;
42+
for (int i = 0; i < maxHeights.size(); i++) {
43+
long ans = maxHeights.get(i);
44+
int pre = maxHeights.get(i);
45+
for (int j = i - 1; j >= 0; j--) {
46+
int cur = Math.min(pre, maxHeights.get(j));
47+
ans += cur;
48+
pre = cur;
49+
}
50+
51+
pre = maxHeights.get(i);
52+
for (int j = i + 1; j < maxHeights.size(); j++) {
53+
int cur = Math.min(pre, maxHeights.get(j));
54+
ans += cur;
55+
pre = cur;
56+
}
57+
res = Math.max(res, ans);
58+
}
59+
return res;
60+
}*/
61+
62+
63+
//单调栈
64+
static public long maximumSumOfHeights(List<Integer> maxHeights) {
65+
long[] left = help(maxHeights);
66+
67+
List<Integer> reverse = new ArrayList<>();
68+
for (int i = maxHeights.size() - 1; i >= 0; i--) {
69+
reverse.add(maxHeights.get(i));
70+
}
71+
long[] right = help(reverse);
72+
73+
long ans = 0;
74+
for (int i = 0; i < maxHeights.size(); i++) {
75+
ans = Math.max(ans, left[i] + right[maxHeights.size() - i]);
76+
}
77+
return ans;
78+
}
79+
80+
static long[] help(List<Integer> maxHeights) {
81+
long[] left = new long[maxHeights.size() + 1];
82+
ArrayDeque<int[]> deque = new ArrayDeque<>();
83+
deque.add(new int[]{0, -1});
84+
for (int i = 0; i < maxHeights.size(); i++) {
85+
while (!deque.isEmpty() && deque.peekLast()[0] > maxHeights.get(i)) {
86+
deque.pollLast();
87+
}
88+
int minIndex = deque.peekLast()[1];
89+
left[i + 1] = left[minIndex + 1] + (i - minIndex) * (long) maxHeights.get(i);
90+
deque.add(new int[]{maxHeights.get(i), i});
91+
}
92+
return left;
93+
}
94+
95+
96+
public static List<Integer> getPrimes(int n) {
97+
boolean[] isComposite = new boolean[n + 1];
98+
List<Integer> primes = new ArrayList<>();
99+
100+
for (int i = 2; i <= n; i++) {
101+
if (!isComposite[i]) {
102+
primes.add(i);
103+
for (int j = i * 2; j >= 0 && j <= n; j += i) { // 标记该数的倍数为合数
104+
isComposite[j] = true;
105+
}
106+
}
107+
}
108+
return primes;
109+
}
110+
111+
static Set<Integer> set = new HashSet<>();
112+
113+
static {
114+
115+
for (Integer prime : getPrimes(1000001)) {
116+
set.add(prime);
117+
}
118+
}
119+
120+
//负责dfs
121+
public long countPaths(int n, int[][] edges) {
122+
Map<Integer, List<Integer>> map = new HashMap<>();
123+
for (int[] edge : edges) {
124+
if (!map.containsKey(edge[0])) {
125+
map.put(edge[0], new ArrayList<>());
126+
}
127+
if (!map.containsKey(edge[1])) {
128+
map.put(edge[1], new ArrayList<>());
129+
}
130+
map.get(edge[0]).add(edge[1]);
131+
map.get(edge[1]).add(edge[0]);
132+
}
133+
dfs(1, -1, map);
134+
return ans;
135+
}
136+
137+
long ans = 0;
138+
139+
long[] dfs(int cur, int parent, Map<Integer, List<Integer>> map) {
140+
141+
boolean isPrime = set.contains(cur);
142+
long[] counts = new long[2];
143+
144+
if (!isPrime) {
145+
counts[0] = 1;
146+
} else {
147+
counts[1] = 1;
148+
}
149+
150+
for (Integer child : map.getOrDefault(cur, new ArrayList<>())) {
151+
if (child == parent) continue;
152+
long[] ints = dfs(child, cur, map);
153+
ans+=ints[0]*counts[1]+ints[1]*counts[0];
154+
if (!isPrime) {
155+
counts[0]+=ints[0];
156+
counts[1]+=ints[1];
157+
} else {
158+
counts[1]+=ints[0];
159+
}
160+
}
161+
return counts;
162+
}
163+
164+
public static void main(String[] args) {
165+
wk364 w = new wk364();
166+
w.countPaths(5, new int[][]{
167+
{1, 2}, {1, 3}, {2, 4}, {2, 5}
168+
});
169+
}
170+
}

0 commit comments

Comments
 (0)