Skip to content

Commit 13b21b8

Browse files
authored
feat: add ts solution to lc problem: No.2528 (#2741)
1 parent 751130e commit 13b21b8

File tree

3 files changed

+156
-0
lines changed

3 files changed

+156
-0
lines changed

solution/2500-2599/2528.Maximize the Minimum Powered City/README.md

+53
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,59 @@ func maxPower(stations []int, r int, k int) int64 {
271271
}
272272
```
273273

274+
```ts
275+
function maxPower(stations: number[], r: number, k: number): number {
276+
function check(x: bigint, k: bigint): boolean {
277+
d.fill(0n);
278+
let t = 0n;
279+
for (let i = 0; i < n; ++i) {
280+
t += d[i];
281+
const dist = x - (s[i] + t);
282+
if (dist > 0) {
283+
if (k < dist) {
284+
return false;
285+
}
286+
k -= dist;
287+
const j = Math.min(i + r, n - 1);
288+
const left = Math.max(0, j - r);
289+
const right = Math.min(j + r, n - 1);
290+
d[left] += dist;
291+
d[right + 1] -= dist;
292+
t += dist;
293+
}
294+
}
295+
return true;
296+
}
297+
const n = stations.length;
298+
const d: bigint[] = new Array(n + 1).fill(0n);
299+
const s: bigint[] = new Array(n + 1).fill(0n);
300+
301+
for (let i = 0; i < n; ++i) {
302+
const left = Math.max(0, i - r);
303+
const right = Math.min(i + r, n - 1);
304+
d[left] += BigInt(stations[i]);
305+
d[right + 1] -= BigInt(stations[i]);
306+
}
307+
308+
s[0] = d[0];
309+
for (let i = 1; i < n + 1; ++i) {
310+
s[i] = s[i - 1] + d[i];
311+
}
312+
313+
let left = 0n,
314+
right = 1n << 40n;
315+
while (left < right) {
316+
const mid = (left + right + 1n) >> 1n;
317+
if (check(mid, BigInt(k))) {
318+
left = mid;
319+
} else {
320+
right = mid - 1n;
321+
}
322+
}
323+
return Number(left);
324+
}
325+
```
326+
274327
<!-- tabs:end -->
275328

276329
<!-- end -->

solution/2500-2599/2528.Maximize the Minimum Powered City/README_EN.md

+53
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,59 @@ func maxPower(stations []int, r int, k int) int64 {
255255
}
256256
```
257257

258+
```ts
259+
function maxPower(stations: number[], r: number, k: number): number {
260+
function check(x: bigint, k: bigint): boolean {
261+
d.fill(0n);
262+
let t = 0n;
263+
for (let i = 0; i < n; ++i) {
264+
t += d[i];
265+
const dist = x - (s[i] + t);
266+
if (dist > 0) {
267+
if (k < dist) {
268+
return false;
269+
}
270+
k -= dist;
271+
const j = Math.min(i + r, n - 1);
272+
const left = Math.max(0, j - r);
273+
const right = Math.min(j + r, n - 1);
274+
d[left] += dist;
275+
d[right + 1] -= dist;
276+
t += dist;
277+
}
278+
}
279+
return true;
280+
}
281+
const n = stations.length;
282+
const d: bigint[] = new Array(n + 1).fill(0n);
283+
const s: bigint[] = new Array(n + 1).fill(0n);
284+
285+
for (let i = 0; i < n; ++i) {
286+
const left = Math.max(0, i - r);
287+
const right = Math.min(i + r, n - 1);
288+
d[left] += BigInt(stations[i]);
289+
d[right + 1] -= BigInt(stations[i]);
290+
}
291+
292+
s[0] = d[0];
293+
for (let i = 1; i < n + 1; ++i) {
294+
s[i] = s[i - 1] + d[i];
295+
}
296+
297+
let left = 0n,
298+
right = 1n << 40n;
299+
while (left < right) {
300+
const mid = (left + right + 1n) >> 1n;
301+
if (check(mid, BigInt(k))) {
302+
left = mid;
303+
} else {
304+
right = mid - 1n;
305+
}
306+
}
307+
return Number(left);
308+
}
309+
```
310+
258311
<!-- tabs:end -->
259312

260313
<!-- end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
function maxPower(stations: number[], r: number, k: number): number {
2+
function check(x: bigint, k: bigint): boolean {
3+
d.fill(0n);
4+
let t = 0n;
5+
for (let i = 0; i < n; ++i) {
6+
t += d[i];
7+
const dist = x - (s[i] + t);
8+
if (dist > 0) {
9+
if (k < dist) {
10+
return false;
11+
}
12+
k -= dist;
13+
const j = Math.min(i + r, n - 1);
14+
const left = Math.max(0, j - r);
15+
const right = Math.min(j + r, n - 1);
16+
d[left] += dist;
17+
d[right + 1] -= dist;
18+
t += dist;
19+
}
20+
}
21+
return true;
22+
}
23+
const n = stations.length;
24+
const d: bigint[] = new Array(n + 1).fill(0n);
25+
const s: bigint[] = new Array(n + 1).fill(0n);
26+
27+
for (let i = 0; i < n; ++i) {
28+
const left = Math.max(0, i - r);
29+
const right = Math.min(i + r, n - 1);
30+
d[left] += BigInt(stations[i]);
31+
d[right + 1] -= BigInt(stations[i]);
32+
}
33+
34+
s[0] = d[0];
35+
for (let i = 1; i < n + 1; ++i) {
36+
s[i] = s[i - 1] + d[i];
37+
}
38+
39+
let left = 0n,
40+
right = 1n << 40n;
41+
while (left < right) {
42+
const mid = (left + right + 1n) >> 1n;
43+
if (check(mid, BigInt(k))) {
44+
left = mid;
45+
} else {
46+
right = mid - 1n;
47+
}
48+
}
49+
return Number(left);
50+
}

0 commit comments

Comments
 (0)