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 b1df751

Browse files
committed
第163场双周赛T1~T4 & 第463场周赛T1~T4 (8)
1 parent b92d759 commit b1df751

16 files changed

+749
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
public class Solution3648 {
2+
public int minSensors(int n, int m, int k) {
3+
int d = k * 2 + 1;
4+
int a = (n + d - 1) / d;
5+
int b = (m + d - 1) / d;
6+
return a * b;
7+
}
8+
}
9+
/*
10+
3648. 覆盖网格的最少传感器数目
11+
https://leetcode.cn/problems/minimum-sensors-to-cover-grid/description/
12+
13+
第 163 场双周赛 T1。
14+
15+
给你一个 n ×ばつ m 的网格和一个整数 k。
16+
一个放置在单元格 (r, c) 的传感器可以覆盖所有与 (r, c) 的 切比雪夫距离不超过 k 的单元格。
17+
两个单元格 (r1, c1) 和 (r2, c2) 之间的 切比雪夫距离 为 max(|r1 − r2|,|c1 − c2|)。
18+
你的任务是返回覆盖整个网格所需传感器的 最少 数量。
19+
提示:
20+
1 <= n <= 10^3
21+
1 <= m <= 10^3
22+
0 <= k <= 10^3
23+
24+
数学。长和宽分别向上取整。
25+
时间复杂度 O(1)。
26+
*/
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import java.util.Arrays;
2+
3+
public class Solution3649 {
4+
public long perfectPairs(int[] nums) {
5+
int n = nums.length;
6+
int[] a = new int[n];
7+
for (int i = 0; i < n; i++) {
8+
a[i] = Math.abs(nums[i]);
9+
}
10+
Arrays.sort(a);
11+
long ans = 0;
12+
for (int i = 0; i < n; i++) {
13+
int L = lowerBound(a, (a[i] + 1) / 2);
14+
int R = lowerBound(a, a[i] * 2 + 1);
15+
ans += R - L - 1;
16+
}
17+
return ans / 2;
18+
}
19+
20+
private int lowerBound(int[] a, int key) {
21+
int l = 0, r = a.length;
22+
while (l < r) {
23+
int m = l + (r - l) / 2;
24+
if (a[m] >= key) r = m;
25+
else l = m + 1;
26+
}
27+
return l;
28+
}
29+
}
30+
/*
31+
3649. 完美对的数目
32+
https://leetcode.cn/problems/number-of-perfect-pairs/description/
33+
34+
第 163 场双周赛 T2。
35+
36+
给你一个整数数组 nums。
37+
如果一对下标 (i, j) 满足以下条件,则称其为 完美 的:
38+
- i < j
39+
- 令 a = nums[i],b = nums[j]。那么:
40+
- min(|a - b|, |a + b|) <= min(|a|, |b|)
41+
- max(|a - b|, |a + b|) >= max(|a|, |b|)
42+
返回 不同 完美对 的数量。
43+
注意:绝对值 |x| 指的是 x 的 非负 值。
44+
提示:
45+
2 <= nums.length <= 10^5
46+
-10^9 <= nums[i] <= 10^9
47+
48+
猜规律。对于绝对值 x,能组成数对的范围为 [ceil(x/2), 2x],注意减去自身和除以2。
49+
排序 + 二分搜索 找左右端点。
50+
时间复杂度 O(nlogn)。
51+
*/
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import java.util.ArrayList;
2+
import java.util.Arrays;
3+
import java.util.Comparator;
4+
import java.util.List;
5+
import java.util.PriorityQueue;
6+
7+
public class Solution3650 {
8+
public int minCost(int n, int[][] edges) {
9+
List<List<int[]>> adj = new ArrayList<>();
10+
List<List<int[]>> rev = new ArrayList<>();
11+
for (int i = 0; i < n; i++) {
12+
adj.add(new ArrayList<>());
13+
rev.add(new ArrayList<>());
14+
}
15+
16+
for (int[] edge : edges) {
17+
int u = edge[0];
18+
int v = edge[1];
19+
int w = edge[2];
20+
adj.get(u).add(new int[]{v, w});
21+
rev.get(v).add(new int[]{u, w});
22+
}
23+
24+
int[] dist = new int[n];
25+
Arrays.fill(dist, Integer.MAX_VALUE);
26+
dist[0] = 0;
27+
28+
PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[0]));
29+
pq.offer(new int[]{0, 0});
30+
31+
while (!pq.isEmpty()) {
32+
int[] cur = pq.poll();
33+
int cost = cur[0];
34+
int u = cur[1];
35+
36+
if (cost != dist[u]) continue;
37+
if (u == n - 1) break;
38+
39+
for (int[] edge : adj.get(u)) {
40+
int v = edge[0];
41+
int w = edge[1];
42+
int newCost = cost + w;
43+
if (newCost < dist[v]) {
44+
dist[v] = newCost;
45+
pq.offer(new int[]{newCost, v});
46+
}
47+
}
48+
49+
for (int[] edge : rev.get(u)) {
50+
int v = edge[0];
51+
int w = edge[1];
52+
int newCost = cost + 2 * w;
53+
if (newCost < dist[v]) {
54+
dist[v] = newCost;
55+
pq.offer(new int[]{newCost, v});
56+
}
57+
}
58+
}
59+
60+
return dist[n - 1] == Integer.MAX_VALUE ? -1 : dist[n - 1];
61+
}
62+
}
63+
/*
64+
3650. 边反转的最小路径总成本
65+
https://leetcode.cn/problems/minimum-cost-path-with-edge-reversals/description/
66+
67+
第 163 场双周赛 T3。
68+
69+
给你一个包含 n 个节点的有向带权图,节点编号从 0 到 n - 1。同时给你一个数组 edges,其中 edges[i] = [ui, vi, wi] 表示一条从节点 ui 到节点 vi 的有向边,其成本为 wi。
70+
每个节点 ui 都有一个 最多可使用一次 的开关:当你到达 ui 且尚未使用其开关时,你可以对其一条入边 vi → ui 激活开关,将该边反转为 ui → vi 并 立即 穿过它。
71+
反转仅对那一次移动有效,使用反转边的成本为 2 * wi。
72+
返回从节点 0 到达节点 n - 1 的 最小 总成本。如果无法到达,则返回 -1。
73+
提示:
74+
2 <= n <= 5 * 10^4
75+
1 <= edges.length <= 10^5
76+
edges[i] = [ui, vi, wi]
77+
0 <= ui, vi <= n - 1
78+
1 <= wi <= 1000
79+
80+
构造反图 + Dijkstra 最短路。
81+
https://yuanbao.tencent.com/chat/naQivTmsDa/cbd588c6-fa01-4003-ad9d-b2e148c92503
82+
时间复杂度 O(n + mlogm)。
83+
*/
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import java.util.Arrays;
2+
3+
public class Solution3651 {
4+
public int minCost(int[][] grid, int k) {
5+
int m = grid.length;
6+
int n = grid[0].length;
7+
int maxVal = 10000;
8+
int[][][] best = new int[k + 1][m][n];
9+
for (int t = 0; t <= k; t++) {
10+
for (int i = 0; i < m; i++) {
11+
Arrays.fill(best[t][i], Integer.MAX_VALUE);
12+
}
13+
}
14+
best[0][0][0] = 0;
15+
16+
for (int t = 0; t <= k; t++) {
17+
for (int i = 0; i < m; i++) {
18+
for (int j = 0; j < n; j++) {
19+
if (best[t][i][j] == Integer.MAX_VALUE)
20+
continue;
21+
if (j + 1 < n) {
22+
int newCost = best[t][i][j] + grid[i][j + 1];
23+
if (newCost < best[t][i][j + 1]) {
24+
best[t][i][j + 1] = newCost;
25+
}
26+
}
27+
if (i + 1 < m) {
28+
int newCost = best[t][i][j] + grid[i + 1][j];
29+
if (newCost < best[t][i + 1][j]) {
30+
best[t][i + 1][j] = newCost;
31+
}
32+
}
33+
}
34+
}
35+
36+
int[] minCostForValue = new int[maxVal + 1];
37+
Arrays.fill(minCostForValue, Integer.MAX_VALUE);
38+
for (int i = 0; i < m; i++) {
39+
for (int j = 0; j < n; j++) {
40+
if (best[t][i][j] != Integer.MAX_VALUE) {
41+
int val = grid[i][j];
42+
if (best[t][i][j] < minCostForValue[val]) {
43+
minCostForValue[val] = best[t][i][j];
44+
}
45+
}
46+
}
47+
}
48+
49+
int[] minSuffix = new int[maxVal + 1];
50+
minSuffix[maxVal] = minCostForValue[maxVal];
51+
for (int v = maxVal - 1; v >= 0; v--) {
52+
if (minCostForValue[v] < minSuffix[v + 1]) {
53+
minSuffix[v] = minCostForValue[v];
54+
} else {
55+
minSuffix[v] = minSuffix[v + 1];
56+
}
57+
}
58+
59+
if (t < k) {
60+
for (int i = 0; i < m; i++) {
61+
for (int j = 0; j < n; j++) {
62+
int val = grid[i][j];
63+
if (minSuffix[val] < best[t + 1][i][j]) {
64+
best[t + 1][i][j] = minSuffix[val];
65+
}
66+
}
67+
}
68+
}
69+
}
70+
71+
int ans = Integer.MAX_VALUE;
72+
for (int t = 0; t <= k; t++) {
73+
if (best[t][m - 1][n - 1] < ans) {
74+
ans = best[t][m - 1][n - 1];
75+
}
76+
}
77+
return ans;
78+
}
79+
}
80+
/*
81+
3651. 带传送的最小路径成本
82+
https://leetcode.cn/problems/minimum-cost-path-with-teleportations/description/
83+
84+
第 163 场双周赛 T4。
85+
86+
给你一个 m x n 的二维整数数组 grid 和一个整数 k。你从左上角的单元格 (0, 0) 出发,目标是到达右下角的单元格 (m - 1, n - 1)。
87+
有两种移动方式可用:
88+
- 普通移动:你可以从当前单元格 (i, j) 向右或向下移动,即移动到 (i, j + 1)(右)或 (i + 1, j)(下)。成本为目标单元格的值。
89+
- 传送:你可以从任意单元格 (i, j) 传送到任意满足 grid[x][y] <= grid[i][j] 的单元格 (x, y);此移动的成本为 0。你最多可以传送 k 次。
90+
返回从 (0, 0) 到达单元格 (m - 1, n - 1) 的 最小 总成本。
91+
提示:
92+
2 <= m, n <= 80
93+
m == grid.length
94+
n == grid[i].length
95+
0 <= grid[i][j] <= 10^4
96+
0 <= k <= 10
97+
98+
DP + 后缀最小值优化。
99+
https://chat.deepseek.com/a/chat/s/1bf4a47a-246a-4ed2-b511-34da3bc5ff8d
100+
时间复杂度 O((mn+U)k)。
101+
rating 2410 (clist.by)
102+
*/
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
public class Solution3652 {
2+
public long maxProfit(int[] prices, int[] strategy, int k) {
3+
int n = prices.length;
4+
long base = 0;
5+
for (int i = 0; i < n; i++) {
6+
base += (long) strategy[i] * prices[i];
7+
}
8+
9+
long[] prePrice = new long[n + 1];
10+
for (int i = 0; i < n; i++) {
11+
prePrice[i + 1] = prePrice[i] + prices[i];
12+
}
13+
14+
long[] preProd = new long[n + 1];
15+
for (int i = 0; i < n; i++) {
16+
preProd[i + 1] = preProd[i] + (long) strategy[i] * prices[i];
17+
}
18+
19+
int m = k / 2;
20+
long maxDelta = Long.MIN_VALUE;
21+
for (int l = 0; l <= n - k; l++) {
22+
long sum1 = prePrice[l + k] - prePrice[l + m];
23+
long sum2 = preProd[l + k] - preProd[l];
24+
long delta = sum1 - sum2;
25+
if (delta > maxDelta) {
26+
maxDelta = delta;
27+
}
28+
}
29+
if (maxDelta < 0) {
30+
maxDelta = 0;
31+
}
32+
return base + maxDelta;
33+
}
34+
}
35+
/*
36+
3652. 按策略买卖股票的最佳时机
37+
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-using-strategy/description/
38+
39+
第 463 场周赛 T1。
40+
41+
给你两个整数数组 prices 和 strategy,其中:
42+
- prices[i] 表示第 i 天某股票的价格。
43+
- strategy[i] 表示第 i 天的交易策略,其中:
44+
- -1 表示买入一单位股票。
45+
- 0 表示持有股票。
46+
- 1 表示卖出一单位股票。
47+
同时给你一个 偶数 整数 k,你可以对 strategy 进行 最多一次 修改。一次修改包括:
48+
- 选择 strategy 中恰好 k 个 连续 元素。
49+
- 将前 k / 2 个元素设为 0(持有)。
50+
- 将后 k / 2 个元素设为 1(卖出)。
51+
利润 定义为所有天数中 strategy[i] * prices[i] 的 总和 。
52+
返回你可以获得的 最大 可能利润。
53+
注意: 没有预算或股票持有数量的限制,因此所有买入和卖出操作均可行,无需考虑过去的操作。
54+
提示:
55+
2 <= prices.length == strategy.length <= 10^5
56+
1 <= prices[i] <= 10^5
57+
-1 <= strategy[i] <= 1
58+
2 <= k <= prices.length
59+
k 是偶数
60+
61+
前缀和 + 枚举。
62+
https://yuanbao.tencent.com/chat/naQivTmsDa/e1c82dcd-ede4-4c7c-ab9b-301fdcac9252
63+
时间复杂度 O(n)。
64+
*/
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
public class Solution3653 {
2+
private static final int MOD = (int) (1e9 + 7);
3+
4+
public int xorAfterQueries(int[] nums, int[][] queries) {
5+
int n = nums.length;
6+
long[] a = new long[n];
7+
for (int i = 0; i < n; i++) a[i] = nums[i];
8+
9+
for (int[] q : queries) {
10+
int l = q[0], r = q[1], k = q[2], v = q[3];
11+
for (int i = l; i <= r; i += k) {
12+
a[i] = (a[i] * v) % MOD;
13+
}
14+
}
15+
16+
long ans = 0;
17+
for (long v : a) ans ^= v;
18+
return (int) ans;
19+
}
20+
}
21+
/*
22+
3653. 区间乘法查询后的异或 I
23+
https://leetcode.cn/problems/xor-after-range-multiplication-queries-i/description/
24+
25+
第 463 场周赛 T2。
26+
27+
给你一个长度为 n 的整数数组 nums 和一个大小为 q 的二维整数数组 queries,其中 queries[i] = [li, ri, ki, vi]。
28+
对于每个查询,按以下步骤执行操作:
29+
- 设定 idx = li。
30+
- 当 idx <= ri 时:
31+
- 更新:nums[idx] = (nums[idx] * vi) % (10^9 + 7)
32+
- 将 idx += ki。
33+
在处理完所有查询后,返回数组 nums 中所有元素的 按位异或 结果。
34+
提示:
35+
1 <= n == nums.length <= 10^3
36+
1 <= nums[i] <= 10^9
37+
1 <= q == queries.length <= 10^3
38+
queries[i] = [li, ri, ki, vi]
39+
0 <= li <= ri < n
40+
1 <= ki <= n
41+
1 <= vi <= 10^5
42+
43+
模拟。
44+
时间复杂度 O(nq)。
45+
*/

0 commit comments

Comments
(0)

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