题解-luogu-p5503灯塔

[JSOI2016]灯塔

Summarize

给定$n$个点的高度$h_i$,求每个点的$p$值使得对于其他所有的点高度$h_j$满足$h_i + p -sqrt{|i-j|}$

$1\len\le 10^5$

感谢@oy的贡献

Solution

由于根号的存在,本题并没有什么明显的单调性,不能通过二分或单调队列实现。

本题的关键在于问题转化。记 $l_i$ 表示在山峰 $i$ 上建灯塔,并使得山峰 $1…i$ 全部被照亮的最小高度。

$$
h_j\le h_i+l_i - \sqrt{i-j} (1\le j\le i)
$$

$$
h_j+\sqrt{i-j}-h_i\le l_i(1\le j\le i)
$$

$$
l_i=\max_{1\le j\le i}\lbrace h_j+\lceil (\sqrt{i-j}) \rceil \rbrace-h_i
$$

这样 ${l}$ 数组的求解即转化为区间求解最值问题,然而 $\max$ 函数中的 $\lceil (\sqrt{i-j}) \rceil$ 似乎有些棘手。然而观察到当 $\lceil (\sqrt{i-j}) \rceil$ 相等时,只有该区间内最大的 $h_j$ 才会对答案产生贡献。因此我们可以枚举 $\lceil (\sqrt{i-j}) \rceil$ 的值,求出对应的 $j$ 区间内 $h_j$ 的最值作为 $l_i$ 的候选答案。

$r_i$ 的定义与 $l_i$ 类似,最终的 $p_i$ 即为 $\max \lbrace l_i,r_i\rbrace$ 。

求解区间最值可以用 ST 表实现。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <bits/stdc++.h>
using namespace std;

int st[100005][18];
int lg[100005];
int power[320];
int p[100005];
int N;

inline int query(int l, int r) {
int s = lg[r - l + 1];
return max(st[l][s], st[r - (1 << s) + 1][s]);
}

int main() {
lg[1] = 0;
for (register int i = 2; i <= 100000; ++i)
lg[i] = lg[i >> 1] + 1;
for (register int i = 1; i <= 319; ++i) {
power[i] = i * i;
}
scanf("%d", &N);
for (register int i = 1; i <= N; ++i)
scanf("%d", &st[i][0]);
for (register int j = 1; j <= lg[N]; ++j)
for (register int i = 1; i + (1 << j) - 1 <= N; ++i)
st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
for (register int i = 1; i <= N; ++i) {
int delta = 0, l = i, r = i;
while (l >= 1) {
p[i] = max(p[i], query(l, r) + delta - st[i][0]);
r = l - 1, l = i - power[++delta];
}
if (r >= 1) p[i] = max(p[i], query(1, r) + delta - st[i][0]);

}
for (register int i = N; i >= 1; --i) {
int delta = 0, l = i, r = i;
while (r <= N) {
p[i] = max(p[i], query(l, r) + delta - st[i][0]);
l = r + 1, r = i + power[++delta];
}
if (l <= N) p[i] = max(p[i], query(l, N) + delta - st[i][0]);
}
for (register int i = 1; i <= N; ++i)
printf("%d\n", p[i]);
return 0;
}

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×