Skip to content

Commit 73a08e6

Browse files
committed
LibreOJ: 2074
「JSOI2016」灯塔
1 parent 00122bf commit 73a08e6

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

LibreOJ/2074.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/**
2+
* @file 2074.cpp
3+
* @author Macesuted ([email protected])
4+
* @date 2022-05-30
5+
*
6+
* @copyright Copyright (c) 2022
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
bool mem1;
14+
15+
#define maxn 100005
16+
#define maxlgn 20
17+
18+
int a[maxn], maxVal[maxlgn][maxn], lg[maxn];
19+
20+
int getMax(int l, int r) {
21+
int x = lg[r - l + 1];
22+
return max(maxVal[x][l], maxVal[x][r - (1 << x) + 1]);
23+
}
24+
25+
void solve(void) {
26+
int n;
27+
cin >> n;
28+
for (int i = 1; i <= n; i++) cin >> a[i], maxVal[0][i] = a[i];
29+
for (int i = 1; i <= n; i++) {
30+
lg[i] = lg[i - 1];
31+
if (1 << (lg[i] + 1) <= i) lg[i]++;
32+
}
33+
for (int i = 1; i < maxlgn; i++)
34+
for (int j = 1; j <= n; j++) maxVal[i][j] = max(maxVal[i - 1][j], maxVal[i - 1][min(n, j + (1 << (i - 1)))]);
35+
for (int i = 1; i <= n; i++) {
36+
int ans = 0;
37+
for (int v = 1; i - (v - 1) * (v - 1) - 1 >= 1; v++)
38+
ans = max(ans, getMax(max(1, i - v * v), i - (v - 1) * (v - 1) - 1) + v);
39+
for (int v = 1; i + (v - 1) * (v - 1) + 1 <= n; v++)
40+
ans = max(ans, getMax(i + (v - 1) * (v - 1) + 1, min(n, i + v * v)) + v);
41+
cout << max(0, ans - a[i]) << endl;
42+
}
43+
return;
44+
}
45+
46+
bool mem2;
47+
48+
int main() {
49+
ios::sync_with_stdio(false);
50+
#ifdef LOCAL
51+
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
52+
#endif
53+
54+
int _ = 1;
55+
while (_--) solve();
56+
57+
#ifdef LOCAL
58+
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
59+
#endif
60+
return 0;
61+
}

0 commit comments

Comments
 (0)