Skip to content

Commit 2d3b544

Browse files
committed
Improved tasks 3477-3480
1 parent 4821e0b commit 2d3b544

File tree

4 files changed

+154
-96
lines changed

4 files changed

+154
-96
lines changed
Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,23 @@
11
package g3401_3500.s3477_fruits_into_baskets_ii;
22

33
// #Easy #Array #Binary_Search #Simulation #Segment_Tree
4-
// #2025_03_10_Time_2_ms_(100.00%)_Space_43.96_MB_(100.00%)
4+
// #2025_03_10_Time_1_ms_(100.00%)_Space_44.78_MB_(36.06%)
55

66
public class Solution {
77
public int numOfUnplacedFruits(int[] fruits, int[] baskets) {
88
int n = fruits.length;
9-
int ct = 0;
10-
boolean[] used = new boolean[n];
11-
for (int fruit : fruits) {
12-
boolean flag = true;
13-
for (int i = 0; i < n; i++) {
14-
if (fruit <= baskets[i] && !used[i]) {
15-
used[i] = true;
16-
flag = false;
9+
int currfruits;
10+
int count = 0;
11+
for (int i = 0; i < n; i++) {
12+
currfruits = fruits[i];
13+
for (int j = 0; j < n; j++) {
14+
if (baskets[j] >= currfruits) {
15+
count++;
16+
baskets[j] = 0;
1717
break;
1818
}
1919
}
20-
if (flag) {
21-
ct++;
22-
}
2320
}
24-
return ct;
21+
return n - count;
2522
}
2623
}
Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,54 @@
11
package g3401_3500.s3478_choose_k_elements_with_maximum_sum;
22

33
// #Medium #Array #Sorting #Heap_Priority_Queue
4-
// #2025_03_10_Time_157_ms_(100.00%)_Space_62.83_MB_(100.00%)
4+
// #2025_03_10_Time_105_ms_(98.60%)_Space_69.10_MB_(28.75%)
55

66
import java.util.Arrays;
77
import java.util.PriorityQueue;
88

99
public class Solution {
1010
public long[] findMaxSum(int[] nums1, int[] nums2, int k) {
1111
int n = nums1.length;
12-
int[][] arr = new int[n][3];
12+
long[] ans = new long[n];
13+
Point[] ps = new Point[n];
1314
for (int i = 0; i < n; i++) {
14-
arr[i][0] = nums1[i];
15-
arr[i][1] = nums2[i];
16-
arr[i][2] = i;
15+
ps[i] = new Point(nums1[i], nums2[i], i);
1716
}
18-
Arrays.sort(arr, (a, b) -> a[0] - b[0]);
19-
long[] ans = new long[n];
17+
Arrays.sort(ps, (p1, p2) -> Integer.compare(p1.x, p2.x));
2018
PriorityQueue<Integer> pq = new PriorityQueue<>();
21-
long sum = 0;
22-
for (int i = 0; i < n; i++) {
23-
if (i > 0 && arr[i - 1][0] == arr[i][0]) {
24-
ans[arr[i][2]] = ans[arr[i - 1][2]];
25-
} else {
26-
ans[arr[i][2]] = sum;
19+
long s = 0;
20+
int i = 0;
21+
while (i < n) {
22+
int j = i;
23+
while (j < n && ps[j].x == ps[i].x) {
24+
ans[ps[j].i] = s;
25+
j++;
2726
}
28-
pq.add(arr[i][1]);
29-
sum += arr[i][1];
30-
if (pq.size() > k) {
31-
sum -= pq.remove();
27+
for (int p = i; p < j; p++) {
28+
int cur = ps[p].y;
29+
if (pq.size() < k) {
30+
pq.offer(cur);
31+
s += cur;
32+
} else if (cur > pq.peek()) {
33+
s -= pq.poll();
34+
pq.offer(cur);
35+
s += cur;
36+
}
3237
}
38+
i = j;
3339
}
3440
return ans;
3541
}
42+
43+
private static class Point {
44+
int x;
45+
int y;
46+
int i;
47+
48+
Point(int x, int y, int i) {
49+
this.x = x;
50+
this.y = y;
51+
this.i = i;
52+
}
53+
}
3654
}
Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,49 @@
11
package g3401_3500.s3479_fruits_into_baskets_iii;
22

33
// #Medium #Array #Binary_Search #Ordered_Set #Segment_Tree
4-
// #2025_03_10_Time_655_ms_(100.00%)_Space_65.58_MB_(100.00%)
5-
6-
import java.util.ArrayList;
7-
import java.util.List;
4+
// #2025_03_10_Time_38_ms_(97.76%)_Space_67.52_MB_(38.48%)
85

96
public class Solution {
107
public int numOfUnplacedFruits(int[] fruits, int[] baskets) {
11-
int unp = 0;
12-
int max = 0;
13-
List<Integer> list = new ArrayList<>();
14-
for (int basket : baskets) {
15-
list.add(basket);
16-
max = Math.max(max, basket);
8+
int n = baskets.length;
9+
int size = 1;
10+
while (size < n) {
11+
size <<= 1;
12+
}
13+
int[] seg = new int[2 * size];
14+
for (int i = 0; i < n; i++) {
15+
seg[size + i] = baskets[i];
16+
}
17+
for (int i = n; i < size; i++) {
18+
seg[size + i] = 0;
19+
}
20+
for (int i = size - 1; i > 0; i--) {
21+
seg[i] = Math.max(seg[i << 1], seg[i << 1 | 1]);
1722
}
18-
for (int fruit : fruits) {
19-
if (fruit > max) {
20-
unp++;
23+
int ans = 0;
24+
for (int f : fruits) {
25+
if (seg[1] < f) {
26+
ans++;
2127
continue;
2228
}
23-
boolean placed = false;
24-
for (int j = 0; j < list.size(); j++) {
25-
if (list.get(j) >= fruit) {
26-
list.remove(j);
27-
placed = true;
28-
break;
29+
int idx = 1;
30+
while (idx < size) {
31+
if (seg[idx << 1] >= f) {
32+
idx = idx << 1;
33+
} else {
34+
idx = idx << 1 | 1;
2935
}
3036
}
31-
if (!placed) {
32-
unp++;
33-
}
37+
update(seg, idx - size, 0, size);
38+
}
39+
return ans;
40+
}
41+
42+
private void update(int[] seg, int pos, int val, int size) {
43+
int i = pos + size;
44+
seg[i] = val;
45+
for (i /= 2; i > 0; i /= 2) {
46+
seg[i] = Math.max(seg[i << 1], seg[i << 1 | 1]);
3447
}
35-
return unp;
3648
}
3749
}
Lines changed: 74 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,91 @@
11
package g3401_3500.s3480_maximize_subarrays_after_removing_one_conflicting_pair;
22

33
// #Hard #Array #Prefix_Sum #Enumeration #Segment_Tree
4-
// #2025_03_10_Time_567_ms_(100.00%)_Space_159.65_MB_(100.00%)
4+
// #2025_03_10_Time_20_ms_(98.86%)_Space_141.78_MB_(52.27%)
55

6-
import java.util.ArrayList;
76
import java.util.Arrays;
8-
import java.util.Comparator;
9-
import java.util.List;
10-
import java.util.Map;
11-
import java.util.TreeMap;
127

138
public class Solution {
14-
public long maxSubarrays(int n, int[][] cp) {
15-
for (int[] pair : cp) {
16-
if (pair[0] > pair[1]) {
17-
int temp = pair[0];
18-
pair[0] = pair[1];
19-
pair[1] = temp;
9+
public long maxSubarrays(int n, int[][] conflictingPairs) {
10+
int[][] thornibrax = conflictingPairs;
11+
long totalSubarrays = (long) n * (n + 1) / 2;
12+
int[] h = new int[n + 1];
13+
int[] d2 = new int[n + 1];
14+
Arrays.fill(h, n + 1);
15+
Arrays.fill(d2, n + 1);
16+
for (int[] pair : conflictingPairs) {
17+
int a = pair[0];
18+
int b = pair[1];
19+
if (a > b) {
20+
int temp = a;
21+
a = b;
22+
b = temp;
2023
}
24+
if (b < h[a]) {
25+
d2[a] = h[a];
26+
h[a] = b;
27+
} else if (b < d2[a]) {
28+
d2[a] = b;
29+
}
30+
}
31+
int[] f = new int[n + 2];
32+
f[n + 1] = n + 1;
33+
f[n] = h[n];
34+
for (int i = n - 1; i >= 1; i--) {
35+
f[i] = Math.min(h[i], f[i + 1]);
2136
}
22-
Arrays.sort(cp, Comparator.comparingInt(a -> a[0]));
23-
long[] contributions = new long[cp.length];
24-
long totalPossible = (long) n * (n + 1) / 2;
25-
TreeMap<Integer, List<Integer>> endPointMap = new TreeMap<>();
26-
int currentIndex = cp.length - 1;
27-
for (int start = n; start >= 1; start--) {
28-
while (currentIndex >= 0 && cp[currentIndex][0] >= start) {
29-
int end = cp[currentIndex][1];
30-
endPointMap.computeIfAbsent(end, k -> new ArrayList<>()).add(currentIndex);
31-
currentIndex--;
37+
// calcXAndN(x) returns (n - x + 1) if x <= n, else 0.
38+
// This is the number of forbidden subarrays starting at some i when f[i] = x.
39+
long originalUnion = 0;
40+
for (int i = 1; i <= n; i++) {
41+
if (f[i] <= n) {
42+
originalUnion += (n - f[i] + 1);
3243
}
33-
if (endPointMap.isEmpty()) {
44+
}
45+
long originalValid = totalSubarrays - originalUnion;
46+
long best = originalValid;
47+
// For each index j (1 <= j <= n) where a candidate conflicting pair exists,
48+
// simulate removal of the pair that gave h[j] (if any).
49+
// (If there is no candidate pair at j, h[j] remains n+1.)
50+
for (int j = 1; j <= n; j++) {
51+
// no conflicting pair at index j
52+
if (h[j] == n + 1) {
3453
continue;
3554
}
36-
Map.Entry<Integer, List<Integer>> firstEntry = endPointMap.firstEntry();
37-
int smallestEnd = firstEntry.getKey();
38-
int pairIndex = firstEntry.getValue().get(0);
39-
if (firstEntry.getValue().size() == 1) {
40-
endPointMap.remove(smallestEnd);
41-
} else {
42-
firstEntry.getValue().remove(0);
55+
// Only if removal would change h[j] (i.e. h[j] < d2[j])
56+
// no alternative candidate exists
57+
if (d2[j] == h[j]) {
58+
continue;
4359
}
44-
long covered = n - smallestEnd + 1L;
45-
totalPossible -= covered;
46-
if (endPointMap.isEmpty()) {
47-
contributions[pairIndex] += covered;
48-
} else {
49-
int nextEnd = endPointMap.firstKey();
50-
contributions[pairIndex] += nextEnd - smallestEnd;
60+
// Simulate removal: new candidate at j becomes d2[j]
61+
int newCandidate = (j < n) ? Math.min(d2[j], f[j + 1]) : d2[j];
62+
// We'll recompute the new f values for indices 1..j.
63+
// Let newF[i] denote the updated value.
64+
// For i > j, newF[i] remains as original f[i].
65+
// For i = j, newF[j] = min( newCandidate, f[j+1] ) (which is newCandidate by
66+
// definition).
67+
int newFj = newCandidate;
68+
// calcXAndN(x) is defined as (n - x + 1) if x<= n, else 0.
69+
long delta = calcXAndN(newFj, n) - calcXAndN(f[j], n);
70+
int cur = newFj;
71+
// Now update backwards for i = j-1 down to 1.
72+
for (int i = j - 1; i >= 1; i--) {
73+
int newVal = Math.min(h[i], cur);
74+
// no further change for i' <= i
75+
if (newVal == f[i]) {
76+
break;
77+
}
78+
delta += calcXAndN(newVal, n) - calcXAndN(f[i], n);
79+
cur = newVal;
5180
}
52-
endPointMap.computeIfAbsent(smallestEnd, k -> new ArrayList<>()).add(pairIndex);
81+
long newUnion = originalUnion + delta;
82+
long newValid = totalSubarrays - newUnion;
83+
best = Math.max(best, newValid);
5384
}
54-
long result = totalPossible;
55-
for (long contribution : contributions) {
56-
result = Math.max(result, totalPossible + contribution);
57-
}
58-
return result;
85+
return best;
86+
}
87+
88+
private long calcXAndN(int x, int n) {
89+
return x <= n ? (n - x + 1) : 0;
5990
}
6091
}

0 commit comments

Comments
 (0)