3480. Maximize Subarrays After Removing One Conflicting Pair
C++
class Solution {
public:
long long maxSubarrays(int n, vector<vector<int>>& conflictingPairs) {
long validSubarrays = 0;
int maxLeft = 0;
int secondMaxLeft = 0;
vector<long> gains(n + 1);
vector<vector<int>> conflicts(n + 1);
for (const vector<int>& pair : conflictingPairs) {
const int a = pair[0];
const int b = pair[1];
conflicts[max(a, b)].push_back(min(a, b));
}
for (int right = 1; right <= n; ++right) {
for (const int left : conflicts[right]) {
if (left > maxLeft) {
secondMaxLeft = maxLeft;
maxLeft = left;
} else if (left > secondMaxLeft) {
secondMaxLeft = left;
}
}
validSubarrays += right - maxLeft;
gains[maxLeft] += maxLeft - secondMaxLeft;
}
return validSubarrays + ranges::max(gains);
}
};
JAVA
class Solution {
public long maxSubarrays(int n, int[][] conflictingPairs) {
long validSubarrays = 0;
int maxLeft = 0;
int secondMaxLeft = 0;
long[] gains = new long[n + 1];
List<Integer>[] conflicts = new List[n + 1];
for (int i = 0; i <= n; ++i)
conflicts[i] = new ArrayList<>();
for (int[] pair : conflictingPairs) {
final int a = pair[0];
final int b = pair[1];
conflicts[Math.max(a, b)].add(Math.min(a, b));
}
for (int right = 1; right <= n; ++right) {
for (int left : conflicts[right]) {
if (left > maxLeft) {
secondMaxLeft = maxLeft;
maxLeft = left;
} else if (left > secondMaxLeft) {
secondMaxLeft = left;
}
}
validSubarrays += right - maxLeft;
gains[maxLeft] += maxLeft - secondMaxLeft;
}
return validSubarrays + Arrays.stream(gains).max().getAsLong();
}
}
Comments
Post a Comment