Skip to content

Commit cb659df

Browse files
authored
Create 2528. Maximize the Minimum Powered City
1 parent 7609d88 commit cb659df

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
class Solution {
2+
public:
3+
vector<long long> diffArray; // For efficient range updates
4+
vector<long long> cityPower; // Current power in each city
5+
int n;
6+
7+
// Check if we can make every city's power at least `target`
8+
bool canAchieve(long long target, int r, long long kAvailable) {
9+
fill(diffArray.begin(), diffArray.end(), 0);
10+
long long runningAdd = 0;
11+
12+
for (int i = 0; i < n; i++) {
13+
runningAdd += diffArray[i];
14+
long long currentPower = cityPower[i] + runningAdd;
15+
16+
if (currentPower < target) {
17+
long long need = target - currentPower;
18+
kAvailable -= need;
19+
if (kAvailable < 0) return false;
20+
21+
runningAdd += need;
22+
if (i + 2 * r + 1 < n)
23+
diffArray[i + 2 * r + 1] -= need;
24+
}
25+
}
26+
return true;
27+
}
28+
29+
long long maxPower(vector<int>& stations, int r, int k) {
30+
n = stations.size();
31+
cityPower.assign(n, 0);
32+
diffArray.assign(n, 0);
33+
34+
// Step 1: Compute total initial power per city (range effect)
35+
vector<long long> prefix(n + 1, 0);
36+
for (int i = 0; i < n; i++)
37+
prefix[i + 1] = prefix[i] + stations[i];
38+
39+
for (int i = 0; i < n; i++) {
40+
int left = max(0, i - r);
41+
int right = min(n - 1, i + r);
42+
cityPower[i] = prefix[right + 1] - prefix[left];
43+
}
44+
45+
// Step 2: Binary search for the maximum possible minimum power
46+
long long low = *min_element(cityPower.begin(), cityPower.end());
47+
long long high = *max_element(cityPower.begin(), cityPower.end()) + k;
48+
long long best = 0;
49+
50+
while (low <= high) {
51+
long long mid = low + (high - low) / 2;
52+
53+
if (canAchieve(mid, r, k)) {
54+
best = mid;
55+
low = mid + 1;
56+
} else {
57+
high = mid - 1;
58+
}
59+
}
60+
61+
return best;
62+
}
63+
};

0 commit comments

Comments
 (0)